1.IO流的概述
流:就是一个动态的运行过程
起点和终点—在编程过程中,整个的传输过程中不能中断,如果出现中断会重新开始传输
分类:
顶级父类:
输出流:OutputStream
输入流:InputStream
流的传输处理过程:IPO
在Java的api中有许多的流:
1.字节流(低级流,基本流):通过字节为单位进行传输—byte
2.高级流(缓冲流):使用高级流的时候必须传入一个低级流—高级流的构造函数中必须传入一个低级流的参数
比如:
文件传输:文件流
对象传输:对象流
图像传输:图片流
———-
具体通过api进行查询使用
底层都是byte
2.FileWriter流(输出流)
FileWriter是一个文件传输流,用于在文件中写数据
构造方法:FileWriter(String fileName)传入一个文件的路径
输出流的使用步骤:(死记)—后面使用其他的流都是这样的套路
1.创建输出流对象
2.调用输出流对象的书写数据的方法
3.关闭流—释放资源
package com.igeek_01;/*** @author Lynn* @create 2020-11-26-14:07*/import java.io.FileWriter;//io包中提供了许多的流import java.io.IOException;/*** FileWriter是一个文件传输流,用于在文件中写数据** 需求:* 向文件中写入数据* 写数据--输出流--FileWriter** 构造方法:FileWriter(String fileName)传入一个文件的路径** 输出流的使用步骤:(死记)--后面使用其他的流都是这样的套路* 1.创建输出流对象* 2.调用输出流对象的书写数据的方法* 3.关闭流--释放资源**/public class FileWriterDemo {public static void main(String[] args) throws IOException {//创建输出流对象--定义的路径会自动生成一个文件FileWriter fw=new FileWriter("f:\\a.txt");/*** 创建输出流做了几件事情:* 1.调用了系统中的资源创建一个对象* 2.创建输出流对象--只要流不关闭就一直存在* 3.把输出流对象指向文件*///调用输出流对象的书写数据的方法fw.write("你好io");//写一个字符串//flush();表示刷新缓存区,需要调用这个方法将缓存中的数据全部刷新到文件中fw.flush();//关闭流--释放资源fw.close();}}结果:运行代码在f盘中自动生成a.txt文件
计算机中的路径问题:
- (1)绝对路径—以盘符开始的路径—定位
(2)相对路径—相当于当前项目而言,在项目的根目录下—某一个参照物来进行处理的
close和flash方法的区别:
(1)flash方法:刷新缓存区,流对象还是可以继续使用的
- (2)close方法:先刷新缓存区,然后通知系统来释放资源,流对象就不存在了 ```java package com.igeek_02;
/**
- @author Lynn
- @create 2020-11-26-14:07 */
import java.io.FileWriter; import java.io.IOException;
/**
- FileWriter是一个文件传输流,用于在文件中写数据 *
- 需求:
- 向文件中写入数据
- 写数据—输出流—FileWriter *
- 构造方法:FileWriter(String fileName)传入一个文件的路径 *
- 输出流的使用步骤:(死记)—后面使用其他的流都是这样的套路
- 1.创建输出流对象
- 2.调用输出流对象的书写数据的方法
- 3.关闭流—释放资源 *
- 计算机中的路径问题:
- (1)绝对路径—以盘符开始的路径—定位
- (2)相对路径—相当于当前项目而言,在项目的根目录下—某一个参照物来进行处理的 *
- close和flash方法的区别:
- (1)flash方法:刷新缓存区,流对象还是可以继续使用的
(2)close方法:先刷新缓存区,然后通知系统来释放资源,流对象就不存在了 */ public class FileWriterDemo2 { public static void main(String[] args) throws IOException {
//创建输出流对象--定义的路径会自动生成一个文件
// FileWriter fw=new FileWriter(“f:\a.txt”);
FileWriter fw=new FileWriter("a.txt");//相对路径--当前项目的根目录/*** 创建输出流做了几件事情:* 1.调用了系统中的资源创建一个对象* 2.创建输出流对象--只要流不关闭就一直存在* 3.把输出流对象指向文件*///调用输出流对象的书写数据的方法fw.write("你好io");//写一个字符串//flush();表示刷新缓存区,需要调用这个方法将缓存中的数据全部刷新到文件中fw.flush();//关闭流--释放资源fw.close();
} } 结果: 运行代码 在工程中自动生成该文件a.txt ```
FileWriter其他方法的使用:
- 1.void write(String str):写一个字符串数据
- 2.void write(String str,int index,int length):写一个字符串中的部分数据—从index开始,写length个数据
- 3.void write(int ch):写一个字符数据
—这里的int类型的好处是既可以写char类型也可以写char类型所对应的值
- 4.void write(int ch,int index,int length):写一个数组数据的一部分数据—从index开始,写length个数据 ```java package com.igeek_03;
/**
- @author Lynn
- @create 2020-11-26-14:37 */
import java.io.FileWriter; import java.io.IOException;
/**
- FileWriter其他方法的使用:
- 1.void write(String str):写一个字符串数据
- 2.void write(String str,int index,int length):写一个字符串中的部分数据
- 3.void write(int ch):写一个字符数据—这里的int类型的好处是
- 既可以写char类型也可以写char类型所对应的值
4.void write(int ch,int index,int length):写一个数组数据的一部分数据 */ public class FileWriterDemo3 { public static void main(String[] args)throws IOException {
char c='中';System.out.println(c);//中int a='中';System.out.println(a);//20013int b='A';System.out.println(b);//65int d='琳';System.out.println(d);//王:29579,琳:29747//创建一个对象FileWriter fw=new FileWriter("b.txt");//相对路径//数据操作fw.write("画画的北北,画画的北北,压坏了小野马和带刺的玫瑰",0,7);fw.write("\t\n");fw.write(65);//Afw.write("\t\n");fw.write('A');//Afw.write("\t\n");fw.write("a");//afw.write("\t\n");fw.write(20013);//中char[] ch={'a','b','c','d'};fw.write(ch);fw.write(ch,2,2);//参数1表示截取的写入个数//为了防止忘记关闭流fw.close();
FileWriter实现换行和追加:
换行:\n可以实现换行,但是在某些版本的windows下的记事本中没有效果
如果没有效果,我们可以使用\r\n
在Windows系统中使用换行这个功能的时候,为了代码的健壮性,推荐使用\r\n,保证不出问题
追加:FileWriter(String fileName,boolean append):默认值是false ```java package com.igeek_01;
/**
- @author Lynn
- @create 2020-11-26-15:09 */
import java.io.FileWriter; import java.io.IOException;
/**
- FileWriter实现换行和追加: *
- 换行:\n可以实现换行,但是在某些版本的windows下的记事本中没有效果
- 如果没有效果,我们可以使用\r\n
- 在Windows系统中使用换行这个功能的时候,为了代码的健壮性,推荐使用\r\n,保证不出问题 *
- 追加:FileWriter(String fileName,boolean append):默认值是false
*/
public class FileWriterDemo4 {
public static void main(String[] args) throws IOException {
//创建一个对象--true表示默认追加FileWriter fw=new FileWriter("c.txt",true);//相对路径
//追加字符串for (int i = 0; i <5 ; i++) {fw.write("hello");fw.write("\r\n");//换行}fw.write(65);fw.write("\r\n");fw.write("a");fw.write("\r\n");//为了防止忘记关闭流fw.close();}
}
<a name="mvfOC"></a># 3.FileReader(输入流)<a name="ADKgf"></a>### 从文件中读取数据在控制台显示- 需求:- 从文件中读取数据在控制台显示- 读数据--输入流--FileReader- <br />- FileReader构造函数:- FileReader(String fileName):传入一个文件的路径--保证存在的- <br />- 输出流的使用步骤:(死记)--后面使用其他的流都是这样的套路- 1.创建输入流对象- 2.调用输入流对象的书写数据的方法- 3.关闭流--释放资源- <br />- 注意:- 进行读取的时候不许保证文件存在,如果不存在会报错- Exception in thread "main" java.io.FileNotFoundException: fr.txt (系统找不到指定的文件。)```javapackage com.igeek_02;/*** @author Lynn* @create 2020-11-26-15:21*/import java.io.FileNotFoundException;import java.io.FileReader;import java.io.IOException;/*** 从文件中读取数据在控制台显示** 需求:* 从文件中读取数据在控制台显示* 读数据--输入流--FileReader** FileReader构造函数:* FileReader(String fileName):传入一个文件的路径--保证存在的** 输出流的使用步骤:(死记)--后面使用其他的流都是这样的套路* 1.创建输入流对象* 2.调用输入流对象的书写数据的方法* 3.关闭流--释放资源** 注意:* 进行读取的时候不许保证文件存在,如果不存在会报错* Exception in thread "main" java.io.FileNotFoundException: fr.txt (系统找不到指定的文件。)*/public class FileReaderDemo1 {public static void main(String[] args) throws IOException {//创建一个输入流FileReader fr=new FileReader("b.txt");//调用输入流的方法//通过循环的方式进行读取--当出现-1的时候表示该文件已经读取结束int ch;//设定一个初始值//遍历while ((ch=fr.read()) != -1){//说明文件读取没有结束//读System.out.println((char)ch);//强制类型转换--把int转换为char}//释放资源fr.close();}}
读取数据
批量读取—其实就是将多个字符打包成一个数组,read()方法在读取的时候直接一次性读取一个数组
package com.igeek_02;/*** @author Lynn* @create 2020-11-26-15:21*/import java.io.FileReader;import java.io.IOException;/*** 从文件中读取数据在控制台显示** 需求:* 从文件中读取数据在控制台显示* 读数据--输入流--FileReader** FileReader构造函数:* FileReader(String fileName):传入一个文件的路径--保证存在的** 输出流的使用步骤:(死记)--后面使用其他的流都是这样的套路* 1.创建输入流对象* 2.调用输入流对象的书写数据的方法* 3.关闭流--释放资源** 注意:* 进行读取的时候不许保证文件存在,如果不存在会报错* Exception in thread "main" java.io.FileNotFoundException: fr.txt (系统找不到指定的文件。)*/public class FileReaderDemo2 {public static void main(String[] args) throws IOException {//创建一个输入流FileReader fr=new FileReader("b.txt");//调用read方法--输入流中的方法//int read();--一次读取一个字符//第一次读取int ch=fr.read();System.out.println(ch);//30011System.out.println((char)ch);//画//第二次读取ch=fr.read();System.out.println(ch);//30011System.out.println((char)ch);//画//批量读取--其实就是将多个字符打包成一个数组,read()方法在读取的时候直接一次性读取一个数组int len;//数组长度char[] chs=new char[5];//一次性读取5个字符(5个5个的读取)while ((len= fr.read(chs)) != -1){//表示文件正在读取//一次性读取的是5个字符--多个字符其实就是字符串System.out.print(new String(chs,0,len));}//释放资源fr.close();}}
4.文件的复制
文件的拷贝复制
- 源文件,目标文件
- 需求:
- 把项目中的根路径下的c.txt中的内容复制到项目根路径下的Copy.java中
- 文件的复制也是一个套路—操作步骤是一样的
- 数据源:c.txt—读取文件—FileReader
- 目的地:Copy.java—写入数据—FileWriter ```java package com.igeek_03;
/**
- @author Lynn
- @create 2020-11-26-16:16 */
import java.io.FileNotFoundException; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException;
/**
- 文件的拷贝复制 *
- 源文件,目标文件
- 需求:
- 把项目中的根路径下的c.txt中的内容复制到项目根路径下的Copy.java中
- 文件的复制也是一个套路—操作步骤是一样的 *
- 数据源:c.txt—读取文件—FileReader
目的地:Copy.java—写入数据—FileWriter */ public class CopyFileDemo1 { public static void main(String[] args) throws IOException {
//创建文件的输入流对象FileReader fr=new FileReader("c.txt");//保证源文件存在//创建文件的输出流对象FileWriter fw=new FileWriter("Copy.java");//程序自动创建//读取源文件数据//一次复制一个字符int ch;while ((ch=fr.read()) != -1){//读取//写入数据到目标文件fw.write(ch);}//释放资源--关闭流fr.close();fw.close();
} }
java package com.igeek_03;
/**
- @author Lynn
- @create 2020-11-26-16:16 */
import java.io.FileReader; import java.io.FileWriter; import java.io.IOException;
/**
- 文件的拷贝复制 *
- 源文件,目标文件
- 需求:
- 把项目中的根路径下的c.txt中的内容复制到项目根路径下的Copy.java中
- 文件的复制也是一个套路—操作步骤是一样的 *
- 数据源:c.txt—读取文件—FileReader
目的地:Copy.java—写入数据—FileWriter */ public class CopyFileDemo2 { public static void main(String[] args) throws IOException {
//创建文件的输入流对象FileReader fr=new FileReader("c.txt");//保证源文件存在//创建文件的输出流对象FileWriter fw=new FileWriter("Copy.java");//程序自动创建//读取源文件数据//一次复制1024个字符int len;char[] chs=new char[1024];while ((len=fr.read(chs)) != -1){//读取//写入数据到目标文件fw.write(chs,0,len);}//释放资源--关闭流fr.close();fw.close();
5.BufferedStream
BufferedStream是一个缓冲流
- 包括:
- BufferedWriter:将文本写入字符输出流,缓冲各个字符,从而实现单个字符,数组,字符串的高效写入
- BufferedReader:从字符流中读取文本,缓冲各个字符,从而实现字符,数组和行的高效读取
- 缓冲流属于高级流,在构造函数中必须传入一个低级流才可以使用
- FileWriter就是一个低级流—因为它支持单个字符的写入 ```java package com.igeek_04;
/**
- @author Lynn
- @create 2020-11-26-16:32 */
import java.io.*;
/**
- BufferedStream是一个缓冲流 *
- 包括:
- BufferedWriter:将文本写入字符输出流,缓冲各个字符,从而实现单个字符,数组,字符串的高效写入
- BufferedReader:从字符流中读取文本,缓冲各个字符,从而实现字符,数组和行的高效读取 *
- 缓冲流属于高级流,在构造函数中必须传入一个低级流才可以使用
FileWriter就是一个低级流—因为它支持单个字符的写入 */ public class BufferedStreamDemo { public static void main(String[] args) throws IOException {
//创建输入缓冲流对象--要输入一个低级流BufferedReader br=new BufferedReader(new FileReader("c.txt"));//读取char[] chs=new char[1024];int len;while ((len=br.read(chs)) != -1){System.out.print(new String(chs,0,len));}//释放资源--直接关闭高级流的同时,低级流自己关闭了br.close();//创建缓冲输出流BufferedWriter bw=new BufferedWriter(new FileWriter("bw.txt"));//写入bw.write("我是一颗");//关闭bw.close();
缓冲流实现复制
```java package com.igeek_04;
/**
- @author Lynn
- @create 2020-11-26-16:16 */
import java.io.*;
/**
- 文件的拷贝复制
- 利用缓冲流复制文件
- 源文件,目标文件
- 需求:
- 把项目中的根路径下的c.txt中的内容复制到项目根路径下的Copy.java中
- 文件的复制也是一个套路—操作步骤是一样的 *
- 数据源:c.txt—读取文件—BufferedReader
目的地:Copy.java—写入数据—BufferedWriter */ public class CopyBufferedDemo2 { public static void main(String[] args) throws IOException {
//创建文件的输入流对象BufferedReader br=new BufferedReader(new FileReader("c.txt"));
// FileReader fr=new FileReader(“c.txt”);//保证源文件存在
//创建文件的输出流对象BufferedWriter bw=new BufferedWriter(new FileWriter("Copy1.java"));
// FileWriter fw=new FileWriter(“Copy.java”);//程序自动创建
//读取源文件数据//一次复制1024个字符int len;char[] chs=new char[1024];while ((len=br.read(chs)) != -1){//读取//写入数据到目标文件bw.write(chs,0,len);}//释放资源--关闭流br.close();bw.close();
BufferedStream的特殊功能
- 特殊功能:
- BufferedWriter中
- void newLine()方法:写一个换行符,这个换行符由系统决定的
- BufferedReader中
- String readLine()方法:一次读取一行数据,但是不读取换行符 ```java package com.igeek_05;
/**
- @author Lynn
- @create 2020-11-27-9:36 */
import java.io.*;
/**
- BufferedStream的特殊功能 *
- 特殊功能:
- BufferedWriter中
- void newLine()方法:写一个换行符,这个换行符由系统决定的 *
- BufferedReader中
String readLine()方法:一次读取一行数据,但是不读取换行符 / public class BufferedStreamDemo { public static void main(String[] args) throws IOException {
/*** BufferedWriter中* void newLine()方法:写一个换行符,这个换行符由系统决定的*///创建一个缓冲输出流BufferedWriter bw=new BufferedWriter(new FileWriter("bw2.txt",true));//文件自动生成//验证for (int i = 0; i <10 ; i++) {bw.write("hello"+i);
// bw.write(“\t\n”);//手动添加
bw.newLine();bw.flush();//刷新缓冲流。在循环中,我们可以尽量调用这个刷新缓存区的方法,循环一次就刷新缓存区}//释放资源bw.close();/*** BufferedReader中* String readLine()方法:一次读取一行数据,但是不读取换行符*///创建输入流BufferedReader br=new BufferedReader(new FileReader("bw2.txt"));//先尝试读取一行/*String line=br.readLine();System.out.println(line);//hello0*///用循环读取String line;//初始变量while ((line=br.readLine()) != null){System.out.println(line);}br.close();
汇总5种文件复制的方法
第一种方式:基本流—一次读写一个字符
第二种方式:基本流—一次读写一个字符数组
第三种方式:缓冲流—一次读写一个字符
第四种方式:缓冲流—一次读写一个字符数组
第五种方式:缓冲流—一次读写一行 ```java package com.Copy_01;
/**
- @author Lynn
- @create 2020-11-27-10:23 */
import java.io.*;
/**
汇总5种文件复制的方法 */ public class CopyFileTest { public static void main(String[] args) throws IOException {
//设置目标文件和源文件String srcFile="b.txt";String destFile="copyn.java";method1(srcFile,destFile);method2(srcFile,destFile);method3(srcFile,destFile);method4(srcFile,destFile);method5(srcFile,destFile);
}
//第一种方式:基本流—一次读写一个字符 public static void method1(String srcFile,String destFile) throws IOException {
//创建基本流FileReader fr=new FileReader(srcFile);FileWriter fw=new FileWriter(destFile);//一次读写一个字符int ch;while ((ch=fr.read()) != -1){fw.write(ch);}//释放资源fr.close();fw.close();
}
//第二种方式:基本流—一次读写一个字符数组 public static void method2(String srcFile,String destFile) throws IOException {
//创建基本流FileReader fr=new FileReader(srcFile);FileWriter fw=new FileWriter(destFile);//一次读写一个字符数组char[] chs=new char[1024];int len;while ((len=fr.read(chs)) != -1){fw.write(chs,0,len);}//释放资源fr.close();fw.close();
}
//第三种方式:缓冲流—一次读写一个字符 public static void method3(String srcFile,String destFile) throws IOException {
//BufferedWriter bw=new BufferedWriter(new FileWriter(srcFile));BufferedReader br=new BufferedReader(new FileReader(destFile));//一次读写一个字符int ch;while ((ch=br.read()) != -1){bw.write(ch);}//释放资源br.close();bw.close();
}
//第四种方式:缓冲流—一次读写一个字符数组 public static void method4(String srcFile,String destFile) throws IOException {
//BufferedWriter bw=new BufferedWriter(new FileWriter(srcFile));BufferedReader br=new BufferedReader(new FileReader(destFile));//一次读写一个字符数组char[] chs=new char[1024];int len;while ((len=br.read(chs)) != -1){bw.write(chs,0,len);}//释放资源br.close();bw.close();
}
//第五种方式:缓冲流—一次读写一行 public static void method5(String srcFile,String destFile) throws IOException {
//BufferedWriter bw=new BufferedWriter(new FileWriter(srcFile));BufferedReader br=new BufferedReader(new FileReader(destFile));//一次读写一行String line;while ((line=br.readLine()) != null){bw.write(line);}//释放资源br.close();bw.close();
当前案例用于实现数据持久化
```java package com.practice_01;
/**
- @author Lynn
- @create 2020-11-26-9:31 */
/**
这是一个学生的实体类 */ public class Student { //属性—为了方便获取字符串的信息,统一设置为字符串类型 private String id; private String name; private String age; private String address;
public Student() {
}
public Student(String id, String name, String age, String address) {
this.id = id;this.name = name;this.age = age;this.address = address;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
} }
java package com.practice_01;
/**
- @author Lynn
- @create 2020-11-27-10:58 */
import java.io.BufferedWriter; import java.io.FileWriter; import java.io.IOException; import java.util.ArrayList; import java.util.Scanner;
/**
- 当前案例用于实现数据持久化 *
- 学生信息添加到文件中—-要求封装一个方法实现 *
- 需求分析:
- 1.键盘录入3个学生的信息(学号,姓名,年龄,居住地)存入到集合中,要求学生的学号不能重复
- 2.遍历集合,把每个学生的信息存入到文件中—student.txt
- 3.把每一个学生的信息作为一行数据,每行数据都是:学号,姓名,年龄,居住地 *
- 步骤:
- 1.定义一个学生类
- 2.创建集合对象
- 3.写方法实现键盘录入,并且把学生信息作为元素保存到集合中
- 4.创建缓冲输出流
- 5.遍历集合的同时,按照一定的格式把学生的信息保存到文件中—举例:1001,王嘉尔,27,香港
6.释放资源 */ public class ArrayListToFileDemo { public static void main(String[] args) throws IOException {
//创建集合对象ArrayList<Student> array=new ArrayList<Student>();//封装一个方法--直接调用addStudent(array);addStudent(array);addStudent(array);//写出到文件中BufferedWriter bw=new BufferedWriter(new FileWriter("student.txt"));//for (int i = 0; i < array.size() ; i++) {//Student s= array.get(i);//StringBuilder sb=new StringBuilder();sb.append(s.getId()).append(",");//idsb.append(s.getName()).append(",");//namesb.append(s.getAge()).append(",");//agesb.append(s.getAddress()).append(",");//address//写出到文件bw.write(sb.toString());//将可追加的字符串转换为字符串bw.newLine();//换行bw.flush();}
}
//封装一个方法,添加学生—为了封装的彻底性直接使用私有方法—因为这个方法就在本类中使用 private static void addStudent(ArrayList
array){ Scanner sc=new Scanner(System.in);//判断学号是不是重复String id;while (true){System.out.println("请输入学号:");id= sc.nextLine();//判断//定义一个标记boolean flag=false;for (int i = 0; i < array.size() ; i++) {Student s= array.get(i);//获取学生学号与键盘录入的id比较if(s.getId().equals(id)){flag=true;break;//如果已经存在就跳出}}if(flag){System.out.println("你输入的学号已经存在,请重新输入!");}else {//直接添加break;}}//继续下面的添加操作System.out.println("请输入学生姓名:");String name=sc.nextLine();System.out.println("请输入学生年龄:");String age=sc.nextLine();System.out.println("请输入学生居住地:");String address=sc.nextLine();//封装成一个学生对象--直接利用构造函数Student s=new Student(id,name,age,address);//把学生对象保存到集合中array.add(s);
读取文件中的数据
```java package com.practice_01;
/**
- @author Lynn
- @create 2020-11-27-14:35 */
import java.io.BufferedReader; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; import java.lang.reflect.Member; import java.util.ArrayList;
/**
- 把上一个案例中的student.txt文件中的内容读取出来 *
- 步骤:
- 1.定义一个学生类
- 2.创建集合对象
- 3.创建缓冲输入流对象
- 4.读取文件,并且按照一定的格式保存到集合中
- 5.释放资源
6.遍历集合 */ public class FileToArrayListDemo { public static void main(String[] args) throws IOException {
//创建集合对象ArrayList<Student> array=new ArrayList<Student>();//创建缓冲输入流对象BufferedReader br=new BufferedReader(new FileReader("student.txt"));//读取文件,并且按照一定的格式进行分割String line;while ((line=br.readLine()) != null){//分割字符串--返回的是字符串类型的数组--下标--根据下标进行取值String[] strArray=line.split(",");//创建学生对象并且赋值Student s=new Student();s.setId(strArray[0]);s.setName(strArray[1]);s.setAge(strArray[2]);s.setAddress(strArray[3]);//把学生对象作为元素保存到集合中array.add(s);}//释放资源br.close();//遍历集合,并且输出到控制台System.out.println("学号\t姓名\t年龄\t居住地");for (int i = 0; i < array.size() ; i++) {Student s= array.get(i);System.out.println(s.getId()+"\t"+s.getName()+"\t"+s.getAge()+"\t"+s.getAddress());}
学生管理系统
学生管理系统
步骤:
1.创建一个学生类 ```java package StudentManagement;
/**
- @author Lynn
- @create 2020-11-26-9:31 */
/**
这是一个学生的实体类 */ public class Student { //属性—为了方便获取字符串的信息,统一设置为字符串类型 private String id; private String name; private String age; private String address;
public Student() {
}
public Student(String id, String name, String age, String address) {
this.id = id;this.name = name;this.age = age;this.address = address;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
} }
2.学生管理系统主界面的编写(原始的学生管理系统,只能键盘录入)<br />3.学生管理系统的查看所有学生的信息<br />4.添加学生信息<br />5.删除学生信息<br />6.修改学生信息java package practice03;
/**
- @author Lynn
- @create 2020-11-26-9:28 */
import java.util.ArrayList; import java.util.Scanner;
/**
- 这是一个学生管理系统
- 步骤:
- 1.定义一个学生类
- 2.学生管理系统主界面的编写
- 3.学生管理系统的查看所有学生的信息
- 4.添加学生信息
- 5.删除学生信息
6.修改学生信息 */ public class StudentMangerTest { public static void main(String[] args) {
//定义一个学生类型集合ArrayList<Student> array=new ArrayList<Student>();//为了用户体验度,设计一个界面//利用循环的方式可以重复的展示界面,直到退出程序就结束循环while(true){//主界面的欢迎词System.out.println("---------------------欢迎来到学生管理系统------------------------");System.out.print("1 查看所有学生"+"\t");System.out.print("2 添加学生"+"\t");System.out.print("3 删除学生"+"\t");System.out.print("4 修改学生"+"\t");System.out.print("5 退出系统"+"\t");System.out.println();//键盘录入获取Scanner sc=new Scanner(System.in);String choiceString=sc.nextLine();//用开关键--switch···caseswitch (choiceString){case "1"://查看所有学生findAllAtudent(array);break;case "2"://添加学生addStudent(array);break;case "3"://删除学生deleteStudent(array);break;case "4"://修改学生updateStudent(array);break;case "5"://退出系统default:System.out.println("谢谢使用,欢迎下次再来!");System.exit(0);//Java中提供的break;}}
} //封装一个方法用于查询学生的所有信息 public static void findAllAtudent(ArrayList
array){ //首先来判断集合中是否有数据,如果没有数据,就给出提示,并让该方法不继续往下执行if(array.size()==0){System.out.println("抱歉!目前没有学生信息可供查询,请回去重新选择你的操作");return;//将当前的方法直接结束}//有学生的情况下--遍历查询//\t表示一个Tab键--制表符System.out.println("学号\t姓名\t年龄\t居住地");for (int i = 0; i < array.size() ; i++) {Student s= array.get(i);//输出属性System.out.println(s.getId()+"\t"+s.getName()+"\t"+s.getAge()+"\t"+s.getAddress());}
}
//封装一个方法用于添加学生信息 public static void addStudent(ArrayList
array){ //键盘录入对象Scanner sc=new Scanner(System.in);//所有的对学生的操作都是基于id,所以我们把id属性放到循环的外面String id;//能够实现重复添加学生的信息,所以使用循环while (true){//判断一下这个学号是不是已经存在System.out.println("请输入学号:");id=sc.nextLine();//定义一个标记--假设不存在boolean flag=false;//遍历学号--就是遍历数组for (int i = 0; i < array.size() ; i++) {Student s= array.get(i);//获取学号if(s.getId().equals(id)){flag=true;//学号存在break;}}//这个时候flag就是trueif(flag){System.out.println("你的学号已经被占用,请重新输入!");}else {break;}}//通过验证可以添加学生System.out.println("请输入学生姓名:");String name=sc.nextLine();System.out.println("请输入学生年龄:");String age=sc.nextLine();System.out.println("请输入学生住址:");String address=sc.nextLine();//创建学生对象Student s=new Student();//赋值s.setId(id);s.setName(name);s.setAge(age);s.setAddress(address);//把学生保存到集合中array.add(s);//给出提示System.out.println("添加学生成功!");
}
//封装一个方法用于删除学生信息 public static void deleteStudent(ArrayList
array) { //删除学生的思路:键盘录入一个学号,到集合中去查找,看是否有学生使用的是该学号,如果有就删除该学生//创建键盘录入对象Scanner sc=new Scanner(System.in);System.out.println("请输入你要删除的学生的学号:");String id=sc.nextLine();//遍历集合看看这个id所对应的学生是不是存在--设置一个索引int index=-1;for (int i = 0; i < array.size() ; i++) {//获取每一个学生Student s= array.get(i);//判断学生的学号和键盘录入的id进行比较if(s.getId().equals(id)){//要删除的对象存在index=i;break;}}if(index==-1){System.out.println("抱歉!你要删除的学号对应的学生信息不存在,请回去重新你的选择");}else {array.remove(index);System.out.println("删除成功!");}
}
//封装一个方法用于修改学生信息 public static void updateStudent(ArrayList
array){ //删除学生的思路:键盘录入一个学号,到集合中去查找,看是否有学生使用的是该学号,如果有就修改该学生//创建键盘录入对象Scanner sc=new Scanner(System.in);System.out.println("请输入你要修改的学生的学号:");String id=sc.nextLine();//遍历集合看看这个id所对应的学生是不是存在--设置一个索引int index=-1;for (int i = 0; i < array.size() ; i++) {//获取每一个学生Student s= array.get(i);//判断学生的学号和键盘录入的id进行比较if(s.getId().equals(id)){//要修改的对象存在index=i;break;}}if(index==-1){System.out.println("抱歉!你要修改的学号对应的学生信息不存在,请回去重新你的选择");}else {//开始进行修改System.out.println("请输入新的学生姓名:");String name=sc.nextLine();System.out.println("请输入新的学生年龄:");String age=sc.nextLine();System.out.println("请输入新的学生住址:");String address=sc.nextLine();//创建一个新的对象Student s=new Student();s.setId(id);s.setName(name);s.setAge(age);s.setAddress(address);//修改集合中的学生对象--实际上就是把原来的信息替换array.set(index,s);System.out.println("修改成功!");}
} }
<a name="8Le8t"></a>#### 学生管理系统IO版:A:在学生管理系统案例的基础上,添加新需求<br />B:查看所有的学生的数据需要从students.txt(提供好的)中读取出来 <br />C:增删改都需要先从students.txt中读出学生的数据然后再把改后的<br /><br />**注意:**<br />****1.创建集合对象要写在封装的各个方法中****<br />****2.每个封装的方法中首先要创建缓存输入流,用来读取文件****<br />****3.在添加、删除、修改的封装方法中还要创建输出流,将修改后的数据保存到文件中****<br />1.查看学生信息<br />①创建缓存输入流(BufferedReader)--读取文件<br />②创建集合对象```java//1封装一个方法用于查询学生的所有信息public static void findAllAtudent() throws IOException {BufferedReader br=new BufferedReader(new FileReader("student.txt"));String line;while ((line=br.readLine())!=null){System.out.println(line);}br.close();}
2.添加学生信息
①创建缓存输入流(BufferedReader)—读取文件
②创建集合对象
③添加学生信息
④创建缓存输出流(BufferedWriter)—添加学生后将集合写入文件中
//2封装一个方法用于添加学生信息public static void addStudent() throws IOException {//创建集合ArrayList<Student> array = new ArrayList<Student>();BufferedReader br=new BufferedReader(new FileReader("student.txt"));String line;while ((line=br.readLine()) != null){String[] strArr=line.split(",");Student s=new Student(strArr[0], strArr[1],strArr[2],strArr[3]);array.add(s);}//键盘录入对象Scanner sc = new Scanner(System.in);//所有的对学生的操作都是基于id,所以我们把id属性放到循环的外面String id;//能够实现重复添加学生的信息,所以使用循环while (true) {//判断一下这个学号是不是已经存在System.out.println("请输入学号:");id = sc.nextLine();//定义一个标记--假设不存在boolean flag = false;//遍历学号--就是遍历数组for (int i = 0; i < array.size(); i++) {Student s = array.get(i);//获取学号if (s.getId().equals(id)) {flag = true;//学号存在break;}}//这个时候flag就是trueif (flag) {System.out.println("你的学号已经被占用,请重新输入!");} else {break;}}//通过验证可以添加学生System.out.println("请输入学生姓名:");String name = sc.nextLine();System.out.println("请输入学生年龄:");String age = sc.nextLine();System.out.println("请输入学生住址:");String address = sc.nextLine();//创建学生对象Student s = new Student();//赋值s.setId(id);s.setName(name);s.setAge(age);s.setAddress(address);//把学生保存到集合中array.add(s);//把集合中的数据写入文件BufferedWriter bw = new BufferedWriter(new FileWriter("student.txt",true));String line1=s.getId()+","+s.getName()+","+s.getAge()+","+s.getAddress();bw.write(line1);bw.newLine();bw.flush();bw.close();br.close();//给出提示System.out.println("添加学生成功!");}
3.删除学生
①创建缓存输入流(BufferedReader)—读取文件
②创建集合对象
③删除学生
④创建缓存输出流(BufferedWriter)—添加学生后将集合写入文件中
//3封装一个方法用于删除学生信息public static void deleteStudent() throws IOException {BufferedReader br=new BufferedReader(new FileReader("student.txt"));//创建集合ArrayList<Student> array = new ArrayList<Student>();String line;while ((line=br.readLine()) != null){String[] strArr=line.split(",");Student s=new Student(strArr[0], strArr[1],strArr[2],strArr[3]);array.add(s);}//删除学生的思路:键盘录入一个学号,到集合中去查找,看是否有学生使用的是该学号,如果有就删除该学生//创建键盘录入对象Scanner sc = new Scanner(System.in);System.out.println("请输入你要删除的学生的学号:");String id = sc.nextLine();//遍历集合看看这个id所对应的学生是不是存在--设置一个索引int index = -1;for (int i = 0; i < array.size(); i++) {//获取每一个学生Student s = array.get(i);//判断学生的学号和键盘录入的id进行比较if (s.getId().equals(id)) {//要删除的对象存在index = i;break;}}if (index == -1) {System.out.println("抱歉!你要删除的学号对应的学生信息不存在,请回去重新你的选择");} else {array.remove(index);System.out.println("删除成功!");}BufferedWriter bw = new BufferedWriter(new FileWriter("student.txt"));for (int i = 0; i <array.size(); i++) {String s=array.get(i).getId()+","+array.get(i).getName()+","+array.get(i).getAge()+","+array.get(i).getAddress();bw.write(s);bw.newLine();}bw.close();br.close();}
4.修改学生
①创建缓存输入流(BufferedReader)—读取文件
②创建集合对象
③修改学生
④创建缓存输出流(BufferedWriter)—添加学生后将集合写入文件中
//4封装一个方法用于修改学生信息public static void updateStudent() throws IOException {BufferedReader br=new BufferedReader(new FileReader("student.txt"));//创建集合ArrayList<Student> array = new ArrayList<Student>();String line;while ((line=br.readLine()) != null){String[] strArr=line.split(",");Student s=new Student(strArr[0], strArr[1],strArr[2],strArr[3]);array.add(s);}//修改学生的思路:键盘录入一个学号,到集合中去查找,看是否有学生使用的是该学号,如果有就修改该学生//创建键盘录入对象Scanner sc = new Scanner(System.in);System.out.println("请输入你要修改的学生的学号:");String id = sc.nextLine();//遍历集合看看这个id所对应的学生是不是存在--设置一个索引int index = -1;for (int i = 0; i < array.size(); i++) {//获取每一个学生Student s = array.get(i);//判断学生的学号和键盘录入的id进行比较if (s.getId().equals(id)) {//要修改的对象存在index = i;break;}}if (index == -1) {System.out.println("抱歉!你要修改的学号对应的学生信息不存在,请回去重新你的选择");} else {//开始进行修改System.out.println("请输入新的学生姓名:");String name = sc.nextLine();System.out.println("请输入新的学生年龄:");String age = sc.nextLine();System.out.println("请输入新的学生住址:");String address = sc.nextLine();//创建一个新的对象Student s = new Student();s.setId(id);s.setName(name);s.setAge(age);s.setAddress(address);//修改集合中的学生对象--实际上就是把原来的信息替换array.set(index, s);System.out.println("修改成功!");}BufferedWriter bw = new BufferedWriter(new FileWriter("student.txt"));for (int i = 0; i <array.size(); i++) {String s=array.get(i).getId()+","+array.get(i).getName()+","+array.get(i).getAge()+","+array.get(i).getAddress();bw.write(s);bw.newLine();}bw.close();br.close();}
完整代码
package StudentManagement;/*** @author Lynn* @create 2020-11-27-15:12*/import java.io.*;import java.util.ArrayList;import java.util.List;import java.util.Scanner;import java.util.TreeMap;/***这是一个学生管理系统* 步骤:* 1.定义一个学生类* 2.学生管理系统主界面的编写* 3.学生管理系统的查看所有学生的信息* 4.添加学生信息* 5.删除学生信息* 6.修改学生信息*/public class StudentManagerTest {public static void main(String[] args) throws IOException {//设计界面,利用循环while (true) {System.out.println("---------------------欢迎来到学生管理系统------------------------");System.out.print("1 查看所有学生" + "\t");System.out.print("2 添加学生" + "\t");System.out.print("3 删除学生" + "\t");System.out.print("4 修改学生" + "\t");System.out.print("5 退出系统" + "\t");System.out.println();//键盘录入获取Scanner sc = new Scanner(System.in);String choiceString = sc.nextLine();//用开关键--switch···caseswitch (choiceString) {case "1"://查看所有学生findAllAtudent();break;case "2"://添加学生addStudent();break;case "3"://删除学生deleteStudent();break;case "4"://修改学生updateStudent();break;case "5"://退出系统System.out.println("谢谢使用,欢迎下次再来!");System.exit(0);//Java中提供的break;default:System.out.println("输入格式错误");break;}}}//1封装一个方法用于查询学生的所有信息public static void findAllAtudent() throws IOException {BufferedReader br=new BufferedReader(new FileReader("student.txt"));String line;while ((line=br.readLine())!=null){System.out.println(line);}br.close();}//2封装一个方法用于添加学生信息public static void addStudent() throws IOException {//创建集合ArrayList<Student> array = new ArrayList<Student>();BufferedReader br=new BufferedReader(new FileReader("student.txt"));String line;while ((line=br.readLine()) != null){String[] strArr=line.split(",");Student s=new Student(strArr[0], strArr[1],strArr[2],strArr[3]);array.add(s);}//键盘录入对象Scanner sc = new Scanner(System.in);//所有的对学生的操作都是基于id,所以我们把id属性放到循环的外面String id;//能够实现重复添加学生的信息,所以使用循环while (true) {//判断一下这个学号是不是已经存在System.out.println("请输入学号:");id = sc.nextLine();//定义一个标记--假设不存在boolean flag = false;//遍历学号--就是遍历数组for (int i = 0; i < array.size(); i++) {Student s = array.get(i);//获取学号if (s.getId().equals(id)) {flag = true;//学号存在break;}}//这个时候flag就是trueif (flag) {System.out.println("你的学号已经被占用,请重新输入!");} else {break;}}//通过验证可以添加学生System.out.println("请输入学生姓名:");String name = sc.nextLine();System.out.println("请输入学生年龄:");String age = sc.nextLine();System.out.println("请输入学生住址:");String address = sc.nextLine();//创建学生对象Student s = new Student();//赋值s.setId(id);s.setName(name);s.setAge(age);s.setAddress(address);//把学生保存到集合中array.add(s);//把集合中的数据写入文件BufferedWriter bw = new BufferedWriter(new FileWriter("student.txt",true));String line1=s.getId()+","+s.getName()+","+s.getAge()+","+s.getAddress();bw.write(line1);bw.newLine();bw.flush();bw.close();br.close();//给出提示System.out.println("添加学生成功!");}//3封装一个方法用于删除学生信息public static void deleteStudent() throws IOException {BufferedReader br=new BufferedReader(new FileReader("student.txt"));//创建集合ArrayList<Student> array = new ArrayList<Student>();String line;while ((line=br.readLine()) != null){String[] strArr=line.split(",");Student s=new Student(strArr[0], strArr[1],strArr[2],strArr[3]);array.add(s);}//删除学生的思路:键盘录入一个学号,到集合中去查找,看是否有学生使用的是该学号,如果有就删除该学生//创建键盘录入对象Scanner sc = new Scanner(System.in);System.out.println("请输入你要删除的学生的学号:");String id = sc.nextLine();//遍历集合看看这个id所对应的学生是不是存在--设置一个索引int index = -1;for (int i = 0; i < array.size(); i++) {//获取每一个学生Student s = array.get(i);//判断学生的学号和键盘录入的id进行比较if (s.getId().equals(id)) {//要删除的对象存在index = i;break;}}if (index == -1) {System.out.println("抱歉!你要删除的学号对应的学生信息不存在,请回去重新你的选择");} else {array.remove(index);System.out.println("删除成功!");}BufferedWriter bw = new BufferedWriter(new FileWriter("student.txt"));for (int i = 0; i <array.size(); i++) {String s=array.get(i).getId()+","+array.get(i).getName()+","+array.get(i).getAge()+","+array.get(i).getAddress();bw.write(s);bw.newLine();}bw.close();br.close();}//4封装一个方法用于修改学生信息public static void updateStudent() throws IOException {BufferedReader br=new BufferedReader(new FileReader("student.txt"));//创建集合ArrayList<Student> array = new ArrayList<Student>();String line;while ((line=br.readLine()) != null){String[] strArr=line.split(",");Student s=new Student(strArr[0], strArr[1],strArr[2],strArr[3]);array.add(s);}//修改学生的思路:键盘录入一个学号,到集合中去查找,看是否有学生使用的是该学号,如果有就修改该学生//创建键盘录入对象Scanner sc = new Scanner(System.in);System.out.println("请输入你要修改的学生的学号:");String id = sc.nextLine();//遍历集合看看这个id所对应的学生是不是存在--设置一个索引int index = -1;for (int i = 0; i < array.size(); i++) {//获取每一个学生Student s = array.get(i);//判断学生的学号和键盘录入的id进行比较if (s.getId().equals(id)) {//要修改的对象存在index = i;break;}}if (index == -1) {System.out.println("抱歉!你要修改的学号对应的学生信息不存在,请回去重新你的选择");} else {//开始进行修改System.out.println("请输入新的学生姓名:");String name = sc.nextLine();System.out.println("请输入新的学生年龄:");String age = sc.nextLine();System.out.println("请输入新的学生住址:");String address = sc.nextLine();//创建一个新的对象Student s = new Student();s.setId(id);s.setName(name);s.setAge(age);s.setAddress(address);//修改集合中的学生对象--实际上就是把原来的信息替换array.set(index, s);System.out.println("修改成功!");}BufferedWriter bw = new BufferedWriter(new FileWriter("student.txt"));for (int i = 0; i <array.size(); i++) {String s=array.get(i).getId()+","+array.get(i).getName()+","+array.get(i).getAge()+","+array.get(i).getAddress();bw.write(s);bw.newLine();}bw.close();br.close();}}
