1.IO流的概述

流:就是一个动态的运行过程
起点和终点—在编程过程中,整个的传输过程中不能中断,如果出现中断会重新开始传输

分类:

顶级父类:
输出流:OutputStream
输入流:InputStream

流的传输处理过程:IPO

在Java的api中有许多的流:

1.字节流(低级流,基本流):通过字节为单位进行传输—byte
2.高级流(缓冲流):使用高级流的时候必须传入一个低级流—高级流的构造函数中必须传入一个低级流的参数
比如:
文件传输:文件流
对象传输:对象流
图像传输:图片流
———-
具体通过api进行查询使用
底层都是byte

2.FileWriter流(输出流)

FileWriter是一个文件传输流,用于在文件中写数据
构造方法:FileWriter(String fileName)传入一个文件的路径
输出流的使用步骤:(死记)—后面使用其他的流都是这样的套路
1.创建输出流对象
2.调用输出流对象的书写数据的方法
3.关闭流—释放资源

  1. package com.igeek_01;
  2. /**
  3. * @author Lynn
  4. * @create 2020-11-26-14:07
  5. */
  6. import java.io.FileWriter;//io包中提供了许多的流
  7. import java.io.IOException;
  8. /**
  9. * FileWriter是一个文件传输流,用于在文件中写数据
  10. *
  11. * 需求:
  12. * 向文件中写入数据
  13. * 写数据--输出流--FileWriter
  14. *
  15. * 构造方法:FileWriter(String fileName)传入一个文件的路径
  16. *
  17. * 输出流的使用步骤:(死记)--后面使用其他的流都是这样的套路
  18. * 1.创建输出流对象
  19. * 2.调用输出流对象的书写数据的方法
  20. * 3.关闭流--释放资源
  21. *
  22. */
  23. public class FileWriterDemo {
  24. public static void main(String[] args) throws IOException {
  25. //创建输出流对象--定义的路径会自动生成一个文件
  26. FileWriter fw=new FileWriter("f:\\a.txt");
  27. /**
  28. * 创建输出流做了几件事情:
  29. * 1.调用了系统中的资源创建一个对象
  30. * 2.创建输出流对象--只要流不关闭就一直存在
  31. * 3.把输出流对象指向文件
  32. */
  33. //调用输出流对象的书写数据的方法
  34. fw.write("你好io");//写一个字符串
  35. //flush();表示刷新缓存区,需要调用这个方法将缓存中的数据全部刷新到文件中
  36. fw.flush();
  37. //关闭流--释放资源
  38. fw.close();
  39. }
  40. }
  41. 结果:
  42. 运行代码
  43. 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 {

    1. //创建输出流对象--定义的路径会自动生成一个文件

    // FileWriter fw=new FileWriter(“f:\a.txt”);

    1. FileWriter fw=new FileWriter("a.txt");//相对路径--当前项目的根目录
    2. /**
    3. * 创建输出流做了几件事情:
    4. * 1.调用了系统中的资源创建一个对象
    5. * 2.创建输出流对象--只要流不关闭就一直存在
    6. * 3.把输出流对象指向文件
    7. */
    8. //调用输出流对象的书写数据的方法
    9. fw.write("你好io");//写一个字符串
    10. //flush();表示刷新缓存区,需要调用这个方法将缓存中的数据全部刷新到文件中
    11. fw.flush();
    12. //关闭流--释放资源
    13. 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 {

    1. char c='中';
    2. System.out.println(c);//中
    3. int a='中';
    4. System.out.println(a);//20013
    5. int b='A';
    6. System.out.println(b);//65
    7. int d='琳';
    8. System.out.println(d);//王:29579,琳:29747
    9. //创建一个对象
    10. FileWriter fw=new FileWriter("b.txt");//相对路径
    11. //数据操作
    12. fw.write("画画的北北,画画的北北,压坏了小野马和带刺的玫瑰",0,7);
    13. fw.write("\t\n");
    14. fw.write(65);//A
    15. fw.write("\t\n");
    16. fw.write('A');//A
    17. fw.write("\t\n");
    18. fw.write("a");//a
    19. fw.write("\t\n");
    20. fw.write(20013);//中
    21. char[] ch={'a','b','c','d'};
    22. fw.write(ch);
    23. fw.write(ch,2,2);//参数1表示截取的写入个数
    24. //为了防止忘记关闭流
    25. fw.close();

    } } ```

    FileWriter实现换行和追加:

  • 换行:\n可以实现换行,但是在某些版本的windows下的记事本中没有效果

    1. 如果没有效果,我们可以使用\r\n
    1. 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 {
    1. //创建一个对象--true表示默认追加
    2. FileWriter fw=new FileWriter("c.txt",true);//相对路径
  1. //追加字符串
  2. for (int i = 0; i <5 ; i++) {
  3. fw.write("hello");
  4. fw.write("\r\n");//换行
  5. }
  6. fw.write(65);
  7. fw.write("\r\n");
  8. fw.write("a");
  9. fw.write("\r\n");
  10. //为了防止忘记关闭流
  11. fw.close();
  12. }

}

  1. <a name="mvfOC"></a>
  2. # 3.FileReader(输入流)
  3. <a name="ADKgf"></a>
  4. ### 从文件中读取数据在控制台显示
  5. - 需求:
  6. - 从文件中读取数据在控制台显示
  7. - 读数据--输入流--FileReader
  8. - <br />
  9. - FileReader构造函数:
  10. - FileReader(String fileName):传入一个文件的路径--保证存在的
  11. - <br />
  12. - 输出流的使用步骤:(死记)--后面使用其他的流都是这样的套路
  13. - 1.创建输入流对象
  14. - 2.调用输入流对象的书写数据的方法
  15. - 3.关闭流--释放资源
  16. - <br />
  17. - 注意:
  18. - 进行读取的时候不许保证文件存在,如果不存在会报错
  19. - Exception in thread "main" java.io.FileNotFoundException: fr.txt (系统找不到指定的文件。)
  20. ```java
  21. package com.igeek_02;
  22. /**
  23. * @author Lynn
  24. * @create 2020-11-26-15:21
  25. */
  26. import java.io.FileNotFoundException;
  27. import java.io.FileReader;
  28. import java.io.IOException;
  29. /**
  30. * 从文件中读取数据在控制台显示
  31. *
  32. * 需求:
  33. * 从文件中读取数据在控制台显示
  34. * 读数据--输入流--FileReader
  35. *
  36. * FileReader构造函数:
  37. * FileReader(String fileName):传入一个文件的路径--保证存在的
  38. *
  39. * 输出流的使用步骤:(死记)--后面使用其他的流都是这样的套路
  40. * 1.创建输入流对象
  41. * 2.调用输入流对象的书写数据的方法
  42. * 3.关闭流--释放资源
  43. *
  44. * 注意:
  45. * 进行读取的时候不许保证文件存在,如果不存在会报错
  46. * Exception in thread "main" java.io.FileNotFoundException: fr.txt (系统找不到指定的文件。)
  47. */
  48. public class FileReaderDemo1 {
  49. public static void main(String[] args) throws IOException {
  50. //创建一个输入流
  51. FileReader fr=new FileReader("b.txt");
  52. //调用输入流的方法
  53. //通过循环的方式进行读取--当出现-1的时候表示该文件已经读取结束
  54. int ch;//设定一个初始值
  55. //遍历
  56. while ((ch=fr.read()) != -1){//说明文件读取没有结束
  57. //读
  58. System.out.println((char)ch);//强制类型转换--把int转换为char
  59. }
  60. //释放资源
  61. fr.close();
  62. }
  63. }

读取数据

批量读取—其实就是将多个字符打包成一个数组,read()方法在读取的时候直接一次性读取一个数组

  1. package com.igeek_02;
  2. /**
  3. * @author Lynn
  4. * @create 2020-11-26-15:21
  5. */
  6. import java.io.FileReader;
  7. import java.io.IOException;
  8. /**
  9. * 从文件中读取数据在控制台显示
  10. *
  11. * 需求:
  12. * 从文件中读取数据在控制台显示
  13. * 读数据--输入流--FileReader
  14. *
  15. * FileReader构造函数:
  16. * FileReader(String fileName):传入一个文件的路径--保证存在的
  17. *
  18. * 输出流的使用步骤:(死记)--后面使用其他的流都是这样的套路
  19. * 1.创建输入流对象
  20. * 2.调用输入流对象的书写数据的方法
  21. * 3.关闭流--释放资源
  22. *
  23. * 注意:
  24. * 进行读取的时候不许保证文件存在,如果不存在会报错
  25. * Exception in thread "main" java.io.FileNotFoundException: fr.txt (系统找不到指定的文件。)
  26. */
  27. public class FileReaderDemo2 {
  28. public static void main(String[] args) throws IOException {
  29. //创建一个输入流
  30. FileReader fr=new FileReader("b.txt");
  31. //调用read方法--输入流中的方法
  32. //int read();--一次读取一个字符
  33. //第一次读取
  34. int ch=fr.read();
  35. System.out.println(ch);//30011
  36. System.out.println((char)ch);//画
  37. //第二次读取
  38. ch=fr.read();
  39. System.out.println(ch);//30011
  40. System.out.println((char)ch);//画
  41. //批量读取--其实就是将多个字符打包成一个数组,read()方法在读取的时候直接一次性读取一个数组
  42. int len;//数组长度
  43. char[] chs=new char[5];//一次性读取5个字符(5个5个的读取)
  44. while ((len= fr.read(chs)) != -1){//表示文件正在读取
  45. //一次性读取的是5个字符--多个字符其实就是字符串
  46. System.out.print(new String(chs,0,len));
  47. }
  48. //释放资源
  49. fr.close();
  50. }
  51. }

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 {

    1. //创建文件的输入流对象
    2. FileReader fr=new FileReader("c.txt");//保证源文件存在
    3. //创建文件的输出流对象
    4. FileWriter fw=new FileWriter("Copy.java");//程序自动创建
    5. //读取源文件数据
    6. //一次复制一个字符
    7. int ch;
    8. while ((ch=fr.read()) != -1){//读取
    9. //写入数据到目标文件
    10. fw.write(ch);
    11. }
    12. //释放资源--关闭流
    13. fr.close();
    14. 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 {

    1. //创建文件的输入流对象
    2. FileReader fr=new FileReader("c.txt");//保证源文件存在
    3. //创建文件的输出流对象
    4. FileWriter fw=new FileWriter("Copy.java");//程序自动创建
    5. //读取源文件数据
    6. //一次复制1024个字符
    7. int len;
    8. char[] chs=new char[1024];
    9. while ((len=fr.read(chs)) != -1){//读取
    10. //写入数据到目标文件
    11. fw.write(chs,0,len);
    12. }
    13. //释放资源--关闭流
    14. fr.close();
    15. 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 {

    1. //创建输入缓冲流对象--要输入一个低级流
    2. BufferedReader br=new BufferedReader(new FileReader("c.txt"));
    3. //读取
    4. char[] chs=new char[1024];
    5. int len;
    6. while ((len=br.read(chs)) != -1){
    7. System.out.print(new String(chs,0,len));
    8. }
    9. //释放资源--直接关闭高级流的同时,低级流自己关闭了
    10. br.close();
    11. //创建缓冲输出流
    12. BufferedWriter bw=new BufferedWriter(new FileWriter("bw.txt"));
    13. //写入
    14. bw.write("我是一颗");
    15. //关闭
    16. 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 {

    1. //创建文件的输入流对象
    2. BufferedReader br=new BufferedReader(new FileReader("c.txt"));

    // FileReader fr=new FileReader(“c.txt”);//保证源文件存在

    1. //创建文件的输出流对象
    2. BufferedWriter bw=new BufferedWriter(new FileWriter("Copy1.java"));

    // FileWriter fw=new FileWriter(“Copy.java”);//程序自动创建

    1. //读取源文件数据
    2. //一次复制1024个字符
    3. int len;
    4. char[] chs=new char[1024];
    5. while ((len=br.read(chs)) != -1){//读取
    6. //写入数据到目标文件
    7. bw.write(chs,0,len);
    8. }
    9. //释放资源--关闭流
    10. br.close();
    11. 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 {

    1. /**
    2. * BufferedWriter中
    3. * void newLine()方法:写一个换行符,这个换行符由系统决定的
    4. */
    5. //创建一个缓冲输出流
    6. BufferedWriter bw=new BufferedWriter(new FileWriter("bw2.txt",true));//文件自动生成
    7. //验证
    8. for (int i = 0; i <10 ; i++) {
    9. bw.write("hello"+i);

    // bw.write(“\t\n”);//手动添加

    1. bw.newLine();
    2. bw.flush();//刷新缓冲流。在循环中,我们可以尽量调用这个刷新缓存区的方法,循环一次就刷新缓存区
    3. }
    4. //释放资源
    5. bw.close();
    6. /**
    7. * BufferedReader中
    8. * String readLine()方法:一次读取一行数据,但是不读取换行符
    9. */
    10. //创建输入流
    11. BufferedReader br=new BufferedReader(new FileReader("bw2.txt"));
    12. //先尝试读取一行
    13. /*String line=br.readLine();
    14. System.out.println(line);//hello0*/
    15. //用循环读取
    16. String line;//初始变量
    17. while ((line=br.readLine()) != null){
    18. System.out.println(line);
    19. }
    20. 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 {

    1. //设置目标文件和源文件
    2. String srcFile="b.txt";
    3. String destFile="copyn.java";
    4. method1(srcFile,destFile);
    5. method2(srcFile,destFile);
    6. method3(srcFile,destFile);
    7. method4(srcFile,destFile);
    8. method5(srcFile,destFile);

    }

    //第一种方式:基本流—一次读写一个字符 public static void method1(String srcFile,String destFile) throws IOException {

    1. //创建基本流
    2. FileReader fr=new FileReader(srcFile);
    3. FileWriter fw=new FileWriter(destFile);
    4. //一次读写一个字符
    5. int ch;
    6. while ((ch=fr.read()) != -1){
    7. fw.write(ch);
    8. }
    9. //释放资源
    10. fr.close();
    11. fw.close();

    }

    //第二种方式:基本流—一次读写一个字符数组 public static void method2(String srcFile,String destFile) throws IOException {

    1. //创建基本流
    2. FileReader fr=new FileReader(srcFile);
    3. FileWriter fw=new FileWriter(destFile);
    4. //一次读写一个字符数组
    5. char[] chs=new char[1024];
    6. int len;
    7. while ((len=fr.read(chs)) != -1){
    8. fw.write(chs,0,len);
    9. }
    10. //释放资源
    11. fr.close();
    12. fw.close();

    }

    //第三种方式:缓冲流—一次读写一个字符 public static void method3(String srcFile,String destFile) throws IOException {

    1. //
    2. BufferedWriter bw=new BufferedWriter(new FileWriter(srcFile));
    3. BufferedReader br=new BufferedReader(new FileReader(destFile));
    4. //一次读写一个字符
    5. int ch;
    6. while ((ch=br.read()) != -1){
    7. bw.write(ch);
    8. }
    9. //释放资源
    10. br.close();
    11. bw.close();

    }

    //第四种方式:缓冲流—一次读写一个字符数组 public static void method4(String srcFile,String destFile) throws IOException {

    1. //
    2. BufferedWriter bw=new BufferedWriter(new FileWriter(srcFile));
    3. BufferedReader br=new BufferedReader(new FileReader(destFile));
    4. //一次读写一个字符数组
    5. char[] chs=new char[1024];
    6. int len;
    7. while ((len=br.read(chs)) != -1){
    8. bw.write(chs,0,len);
    9. }
    10. //释放资源
    11. br.close();
    12. bw.close();

    }

    //第五种方式:缓冲流—一次读写一行 public static void method5(String srcFile,String destFile) throws IOException {

    1. //
    2. BufferedWriter bw=new BufferedWriter(new FileWriter(srcFile));
    3. BufferedReader br=new BufferedReader(new FileReader(destFile));
    4. //一次读写一行
    5. String line;
    6. while ((line=br.readLine()) != null){
    7. bw.write(line);
    8. }
    9. //释放资源
    10. br.close();
    11. 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) {

    1. this.id = id;
    2. this.name = name;
    3. this.age = age;
    4. this.address = address;

    }

    public String getId() {

    1. return id;

    }

    public void setId(String id) {

    1. this.id = id;

    }

    public String getName() {

    1. return name;

    }

    public void setName(String name) {

    1. this.name = name;

    }

    public String getAge() {

    1. return age;

    }

    public void setAge(String age) {

    1. this.age = age;

    }

    public String getAddress() {

    1. return address;

    }

    public void setAddress(String address) {

    1. 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 {

    1. //创建集合对象
    2. ArrayList<Student> array=new ArrayList<Student>();
    3. //封装一个方法--直接调用
    4. addStudent(array);
    5. addStudent(array);
    6. addStudent(array);
    7. //写出到文件中
    8. BufferedWriter bw=new BufferedWriter(new FileWriter("student.txt"));
    9. //
    10. for (int i = 0; i < array.size() ; i++) {
    11. //
    12. Student s= array.get(i);
    13. //
    14. StringBuilder sb=new StringBuilder();
    15. sb.append(s.getId()).append(",");//id
    16. sb.append(s.getName()).append(",");//name
    17. sb.append(s.getAge()).append(",");//age
    18. sb.append(s.getAddress()).append(",");//address
    19. //写出到文件
    20. bw.write(sb.toString());//将可追加的字符串转换为字符串
    21. bw.newLine();//换行
    22. bw.flush();
    23. }

    }

    //封装一个方法,添加学生—为了封装的彻底性直接使用私有方法—因为这个方法就在本类中使用 private static void addStudent(ArrayList array){

    1. Scanner sc=new Scanner(System.in);
    2. //判断学号是不是重复
    3. String id;
    4. while (true){
    5. System.out.println("请输入学号:");
    6. id= sc.nextLine();
    7. //判断
    8. //定义一个标记
    9. boolean flag=false;
    10. for (int i = 0; i < array.size() ; i++) {
    11. Student s= array.get(i);
    12. //获取学生学号与键盘录入的id比较
    13. if(s.getId().equals(id)){
    14. flag=true;
    15. break;//如果已经存在就跳出
    16. }
    17. }
    18. if(flag){
    19. System.out.println("你输入的学号已经存在,请重新输入!");
    20. }else {
    21. //直接添加
    22. break;
    23. }
    24. }
    25. //继续下面的添加操作
    26. System.out.println("请输入学生姓名:");
    27. String name=sc.nextLine();
    28. System.out.println("请输入学生年龄:");
    29. String age=sc.nextLine();
    30. System.out.println("请输入学生居住地:");
    31. String address=sc.nextLine();
    32. //封装成一个学生对象--直接利用构造函数
    33. Student s=new Student(id,name,age,address);
    34. //把学生对象保存到集合中
    35. 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 {

    1. //创建集合对象
    2. ArrayList<Student> array=new ArrayList<Student>();
    3. //创建缓冲输入流对象
    4. BufferedReader br=new BufferedReader(new FileReader("student.txt"));
    5. //读取文件,并且按照一定的格式进行分割
    6. String line;
    7. while ((line=br.readLine()) != null){
    8. //分割字符串--返回的是字符串类型的数组--下标--根据下标进行取值
    9. String[] strArray=line.split(",");
    10. //创建学生对象并且赋值
    11. Student s=new Student();
    12. s.setId(strArray[0]);
    13. s.setName(strArray[1]);
    14. s.setAge(strArray[2]);
    15. s.setAddress(strArray[3]);
    16. //把学生对象作为元素保存到集合中
    17. array.add(s);
    18. }
    19. //释放资源
    20. br.close();
    21. //遍历集合,并且输出到控制台
    22. System.out.println("学号\t姓名\t年龄\t居住地");
    23. for (int i = 0; i < array.size() ; i++) {
    24. Student s= array.get(i);
    25. System.out.println(s.getId()+"\t"+s.getName()+"\t"+s.getAge()+"\t"+s.getAddress());
    26. }

    } } ```

    学生管理系统

    学生管理系统

    步骤:
    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) {

    1. this.id = id;
    2. this.name = name;
    3. this.age = age;
    4. this.address = address;

    }

    public String getId() {

    1. return id;

    }

    public void setId(String id) {

    1. this.id = id;

    }

    public String getName() {

    1. return name;

    }

    public void setName(String name) {

    1. this.name = name;

    }

    public String getAge() {

    1. return age;

    }

    public void setAge(String age) {

    1. this.age = age;

    }

    public String getAddress() {

    1. return address;

    }

    public void setAddress(String address) {

    1. 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) {

    1. //定义一个学生类型集合
    2. ArrayList<Student> array=new ArrayList<Student>();
    3. //为了用户体验度,设计一个界面
    4. //利用循环的方式可以重复的展示界面,直到退出程序就结束循环
    5. while(true){
    6. //主界面的欢迎词
    7. System.out.println("---------------------欢迎来到学生管理系统------------------------");
    8. System.out.print("1 查看所有学生"+"\t");
    9. System.out.print("2 添加学生"+"\t");
    10. System.out.print("3 删除学生"+"\t");
    11. System.out.print("4 修改学生"+"\t");
    12. System.out.print("5 退出系统"+"\t");
    13. System.out.println();
    14. //键盘录入获取
    15. Scanner sc=new Scanner(System.in);
    16. String choiceString=sc.nextLine();
    17. //用开关键--switch···case
    18. switch (choiceString){
    19. case "1":
    20. //查看所有学生
    21. findAllAtudent(array);
    22. break;
    23. case "2":
    24. //添加学生
    25. addStudent(array);
    26. break;
    27. case "3":
    28. //删除学生
    29. deleteStudent(array);
    30. break;
    31. case "4":
    32. //修改学生
    33. updateStudent(array);
    34. break;
    35. case "5":
    36. //退出系统
    37. default:
    38. System.out.println("谢谢使用,欢迎下次再来!");
    39. System.exit(0);//Java中提供的
    40. break;
    41. }
    42. }

    } //封装一个方法用于查询学生的所有信息 public static void findAllAtudent(ArrayList array){

    1. //首先来判断集合中是否有数据,如果没有数据,就给出提示,并让该方法不继续往下执行
    2. if(array.size()==0){
    3. System.out.println("抱歉!目前没有学生信息可供查询,请回去重新选择你的操作");
    4. return;//将当前的方法直接结束
    5. }
    6. //有学生的情况下--遍历查询
    7. //\t表示一个Tab键--制表符
    8. System.out.println("学号\t姓名\t年龄\t居住地");
    9. for (int i = 0; i < array.size() ; i++) {
    10. Student s= array.get(i);
    11. //输出属性
    12. System.out.println(s.getId()+"\t"+
    13. s.getName()+"\t"+
    14. s.getAge()+"\t"+
    15. s.getAddress());
    16. }

    }

    //封装一个方法用于添加学生信息 public static void addStudent(ArrayList array){

    1. //键盘录入对象
    2. Scanner sc=new Scanner(System.in);
    3. //所有的对学生的操作都是基于id,所以我们把id属性放到循环的外面
    4. String id;
    5. //能够实现重复添加学生的信息,所以使用循环
    6. while (true){
    7. //判断一下这个学号是不是已经存在
    8. System.out.println("请输入学号:");
    9. id=sc.nextLine();
    10. //定义一个标记--假设不存在
    11. boolean flag=false;
    12. //遍历学号--就是遍历数组
    13. for (int i = 0; i < array.size() ; i++) {
    14. Student s= array.get(i);
    15. //获取学号
    16. if(s.getId().equals(id)){
    17. flag=true;//学号存在
    18. break;
    19. }
    20. }
    21. //这个时候flag就是true
    22. if(flag){
    23. System.out.println("你的学号已经被占用,请重新输入!");
    24. }else {
    25. break;
    26. }
    27. }
    28. //通过验证可以添加学生
    29. System.out.println("请输入学生姓名:");
    30. String name=sc.nextLine();
    31. System.out.println("请输入学生年龄:");
    32. String age=sc.nextLine();
    33. System.out.println("请输入学生住址:");
    34. String address=sc.nextLine();
    35. //创建学生对象
    36. Student s=new Student();
    37. //赋值
    38. s.setId(id);
    39. s.setName(name);
    40. s.setAge(age);
    41. s.setAddress(address);
    42. //把学生保存到集合中
    43. array.add(s);
    44. //给出提示
    45. System.out.println("添加学生成功!");

    }

    //封装一个方法用于删除学生信息 public static void deleteStudent(ArrayList array) {

    1. //删除学生的思路:键盘录入一个学号,到集合中去查找,看是否有学生使用的是该学号,如果有就删除该学生
    2. //创建键盘录入对象
    3. Scanner sc=new Scanner(System.in);
    4. System.out.println("请输入你要删除的学生的学号:");
    5. String id=sc.nextLine();
    6. //遍历集合看看这个id所对应的学生是不是存在--设置一个索引
    7. int index=-1;
    8. for (int i = 0; i < array.size() ; i++) {
    9. //获取每一个学生
    10. Student s= array.get(i);
    11. //判断学生的学号和键盘录入的id进行比较
    12. if(s.getId().equals(id)){//要删除的对象存在
    13. index=i;
    14. break;
    15. }
    16. }
    17. if(index==-1){
    18. System.out.println("抱歉!你要删除的学号对应的学生信息不存在,请回去重新你的选择");
    19. }else {
    20. array.remove(index);
    21. System.out.println("删除成功!");
    22. }

    }

    //封装一个方法用于修改学生信息 public static void updateStudent(ArrayList array){

    1. //删除学生的思路:键盘录入一个学号,到集合中去查找,看是否有学生使用的是该学号,如果有就修改该学生
    2. //创建键盘录入对象
    3. Scanner sc=new Scanner(System.in);
    4. System.out.println("请输入你要修改的学生的学号:");
    5. String id=sc.nextLine();
    6. //遍历集合看看这个id所对应的学生是不是存在--设置一个索引
    7. int index=-1;
    8. for (int i = 0; i < array.size() ; i++) {
    9. //获取每一个学生
    10. Student s= array.get(i);
    11. //判断学生的学号和键盘录入的id进行比较
    12. if(s.getId().equals(id)){//要修改的对象存在
    13. index=i;
    14. break;
    15. }
    16. }
    17. if(index==-1){
    18. System.out.println("抱歉!你要修改的学号对应的学生信息不存在,请回去重新你的选择");
    19. }else {
    20. //开始进行修改
    21. System.out.println("请输入新的学生姓名:");
    22. String name=sc.nextLine();
    23. System.out.println("请输入新的学生年龄:");
    24. String age=sc.nextLine();
    25. System.out.println("请输入新的学生住址:");
    26. String address=sc.nextLine();
    27. //创建一个新的对象
    28. Student s=new Student();
    29. s.setId(id);
    30. s.setName(name);
    31. s.setAge(age);
    32. s.setAddress(address);
    33. //修改集合中的学生对象--实际上就是把原来的信息替换
    34. array.set(index,s);
    35. System.out.println("修改成功!");
    36. }

    } }

    1. <a name="8Le8t"></a>
    2. #### 学生管理系统IO版:
    3. A:在学生管理系统案例的基础上,添加新需求<br />B:查看所有的学生的数据需要从students.txt(提供好的)中读取出来 <br />C:增删改都需要先从students.txt中读出学生的数据然后再把改后的<br />![image.png](https://cdn.nlark.com/yuque/0/2020/png/2706946/1606480166349-74c2c5d2-d72c-48c2-b3e7-c3f14942b67a.png#align=left&display=inline&height=254&margin=%5Bobject%20Object%5D&name=image.png&originHeight=508&originWidth=1151&size=63889&status=done&style=none&width=575.5)<br />**注意:**<br />****1.创建集合对象要写在封装的各个方法中****<br />****2.每个封装的方法中首先要创建缓存输入流,用来读取文件****<br />****3.在添加、删除、修改的封装方法中还要创建输出流,将修改后的数据保存到文件中****<br />1.查看学生信息<br />①创建缓存输入流(BufferedReader)--读取文件<br />②创建集合对象
    4. ```java
    5. //1封装一个方法用于查询学生的所有信息
    6. public static void findAllAtudent() throws IOException {
    7. BufferedReader br=new BufferedReader(new FileReader("student.txt"));
    8. String line;
    9. while ((line=br.readLine())!=null){
    10. System.out.println(line);
    11. }
    12. br.close();
    13. }

    2.添加学生信息

①创建缓存输入流(BufferedReader)—读取文件
②创建集合对象
③添加学生信息
④创建缓存输出流(BufferedWriter)—添加学生后将集合写入文件中

  1. //2封装一个方法用于添加学生信息
  2. public static void addStudent() throws IOException {
  3. //创建集合
  4. ArrayList<Student> array = new ArrayList<Student>();
  5. BufferedReader br=new BufferedReader(new FileReader("student.txt"));
  6. String line;
  7. while ((line=br.readLine()) != null){
  8. String[] strArr=line.split(",");
  9. Student s=new Student(strArr[0], strArr[1],strArr[2],strArr[3]);
  10. array.add(s);
  11. }
  12. //键盘录入对象
  13. Scanner sc = new Scanner(System.in);
  14. //所有的对学生的操作都是基于id,所以我们把id属性放到循环的外面
  15. String id;
  16. //能够实现重复添加学生的信息,所以使用循环
  17. while (true) {
  18. //判断一下这个学号是不是已经存在
  19. System.out.println("请输入学号:");
  20. id = sc.nextLine();
  21. //定义一个标记--假设不存在
  22. boolean flag = false;
  23. //遍历学号--就是遍历数组
  24. for (int i = 0; i < array.size(); i++) {
  25. Student s = array.get(i);
  26. //获取学号
  27. if (s.getId().equals(id)) {
  28. flag = true;//学号存在
  29. break;
  30. }
  31. }
  32. //这个时候flag就是true
  33. if (flag) {
  34. System.out.println("你的学号已经被占用,请重新输入!");
  35. } else {
  36. break;
  37. }
  38. }
  39. //通过验证可以添加学生
  40. System.out.println("请输入学生姓名:");
  41. String name = sc.nextLine();
  42. System.out.println("请输入学生年龄:");
  43. String age = sc.nextLine();
  44. System.out.println("请输入学生住址:");
  45. String address = sc.nextLine();
  46. //创建学生对象
  47. Student s = new Student();
  48. //赋值
  49. s.setId(id);
  50. s.setName(name);
  51. s.setAge(age);
  52. s.setAddress(address);
  53. //把学生保存到集合中
  54. array.add(s);
  55. //把集合中的数据写入文件
  56. BufferedWriter bw = new BufferedWriter(new FileWriter("student.txt",true));
  57. String line1=s.getId()+","+s.getName()+","+s.getAge()+","+s.getAddress();
  58. bw.write(line1);
  59. bw.newLine();
  60. bw.flush();
  61. bw.close();
  62. br.close();
  63. //给出提示
  64. System.out.println("添加学生成功!");
  65. }

3.删除学生
①创建缓存输入流(BufferedReader)—读取文件
②创建集合对象
③删除学生
④创建缓存输出流(BufferedWriter)—添加学生后将集合写入文件中

  1. //3封装一个方法用于删除学生信息
  2. public static void deleteStudent() throws IOException {
  3. BufferedReader br=new BufferedReader(new FileReader("student.txt"));
  4. //创建集合
  5. ArrayList<Student> array = new ArrayList<Student>();
  6. String line;
  7. while ((line=br.readLine()) != null){
  8. String[] strArr=line.split(",");
  9. Student s=new Student(strArr[0], strArr[1],strArr[2],strArr[3]);
  10. array.add(s);
  11. }
  12. //删除学生的思路:键盘录入一个学号,到集合中去查找,看是否有学生使用的是该学号,如果有就删除该学生
  13. //创建键盘录入对象
  14. Scanner sc = new Scanner(System.in);
  15. System.out.println("请输入你要删除的学生的学号:");
  16. String id = sc.nextLine();
  17. //遍历集合看看这个id所对应的学生是不是存在--设置一个索引
  18. int index = -1;
  19. for (int i = 0; i < array.size(); i++) {
  20. //获取每一个学生
  21. Student s = array.get(i);
  22. //判断学生的学号和键盘录入的id进行比较
  23. if (s.getId().equals(id)) {//要删除的对象存在
  24. index = i;
  25. break;
  26. }
  27. }
  28. if (index == -1) {
  29. System.out.println("抱歉!你要删除的学号对应的学生信息不存在,请回去重新你的选择");
  30. } else {
  31. array.remove(index);
  32. System.out.println("删除成功!");
  33. }
  34. BufferedWriter bw = new BufferedWriter(new FileWriter("student.txt"));
  35. for (int i = 0; i <array.size(); i++) {
  36. String s=array.get(i).getId()+","+array.get(i).getName()+","+array.get(i).getAge()+","+array.get(i).getAddress();
  37. bw.write(s);
  38. bw.newLine();
  39. }
  40. bw.close();
  41. br.close();
  42. }

4.修改学生
①创建缓存输入流(BufferedReader)—读取文件
②创建集合对象
③修改学生
④创建缓存输出流(BufferedWriter)—添加学生后将集合写入文件中

  1. //4封装一个方法用于修改学生信息
  2. public static void updateStudent() throws IOException {
  3. BufferedReader br=new BufferedReader(new FileReader("student.txt"));
  4. //创建集合
  5. ArrayList<Student> array = new ArrayList<Student>();
  6. String line;
  7. while ((line=br.readLine()) != null){
  8. String[] strArr=line.split(",");
  9. Student s=new Student(strArr[0], strArr[1],strArr[2],strArr[3]);
  10. array.add(s);
  11. }
  12. //修改学生的思路:键盘录入一个学号,到集合中去查找,看是否有学生使用的是该学号,如果有就修改该学生
  13. //创建键盘录入对象
  14. Scanner sc = new Scanner(System.in);
  15. System.out.println("请输入你要修改的学生的学号:");
  16. String id = sc.nextLine();
  17. //遍历集合看看这个id所对应的学生是不是存在--设置一个索引
  18. int index = -1;
  19. for (int i = 0; i < array.size(); i++) {
  20. //获取每一个学生
  21. Student s = array.get(i);
  22. //判断学生的学号和键盘录入的id进行比较
  23. if (s.getId().equals(id)) {//要修改的对象存在
  24. index = i;
  25. break;
  26. }
  27. }
  28. if (index == -1) {
  29. System.out.println("抱歉!你要修改的学号对应的学生信息不存在,请回去重新你的选择");
  30. } else {
  31. //开始进行修改
  32. System.out.println("请输入新的学生姓名:");
  33. String name = sc.nextLine();
  34. System.out.println("请输入新的学生年龄:");
  35. String age = sc.nextLine();
  36. System.out.println("请输入新的学生住址:");
  37. String address = sc.nextLine();
  38. //创建一个新的对象
  39. Student s = new Student();
  40. s.setId(id);
  41. s.setName(name);
  42. s.setAge(age);
  43. s.setAddress(address);
  44. //修改集合中的学生对象--实际上就是把原来的信息替换
  45. array.set(index, s);
  46. System.out.println("修改成功!");
  47. }
  48. BufferedWriter bw = new BufferedWriter(new FileWriter("student.txt"));
  49. for (int i = 0; i <array.size(); i++) {
  50. String s=array.get(i).getId()+","+array.get(i).getName()+","+array.get(i).getAge()+","+array.get(i).getAddress();
  51. bw.write(s);
  52. bw.newLine();
  53. }
  54. bw.close();
  55. br.close();
  56. }

完整代码

  1. package StudentManagement;
  2. /**
  3. * @author Lynn
  4. * @create 2020-11-27-15:12
  5. */
  6. import java.io.*;
  7. import java.util.ArrayList;
  8. import java.util.List;
  9. import java.util.Scanner;
  10. import java.util.TreeMap;
  11. /**
  12. *这是一个学生管理系统
  13. * 步骤:
  14. * 1.定义一个学生类
  15. * 2.学生管理系统主界面的编写
  16. * 3.学生管理系统的查看所有学生的信息
  17. * 4.添加学生信息
  18. * 5.删除学生信息
  19. * 6.修改学生信息
  20. */
  21. public class StudentManagerTest {
  22. public static void main(String[] args) throws IOException {
  23. //设计界面,利用循环
  24. while (true) {
  25. System.out.println("---------------------欢迎来到学生管理系统------------------------");
  26. System.out.print("1 查看所有学生" + "\t");
  27. System.out.print("2 添加学生" + "\t");
  28. System.out.print("3 删除学生" + "\t");
  29. System.out.print("4 修改学生" + "\t");
  30. System.out.print("5 退出系统" + "\t");
  31. System.out.println();
  32. //键盘录入获取
  33. Scanner sc = new Scanner(System.in);
  34. String choiceString = sc.nextLine();
  35. //用开关键--switch···case
  36. switch (choiceString) {
  37. case "1":
  38. //查看所有学生
  39. findAllAtudent();
  40. break;
  41. case "2":
  42. //添加学生
  43. addStudent();
  44. break;
  45. case "3":
  46. //删除学生
  47. deleteStudent();
  48. break;
  49. case "4":
  50. //修改学生
  51. updateStudent();
  52. break;
  53. case "5":
  54. //退出系统
  55. System.out.println("谢谢使用,欢迎下次再来!");
  56. System.exit(0);//Java中提供的
  57. break;
  58. default:
  59. System.out.println("输入格式错误");
  60. break;
  61. }
  62. }
  63. }
  64. //1封装一个方法用于查询学生的所有信息
  65. public static void findAllAtudent() throws IOException {
  66. BufferedReader br=new BufferedReader(new FileReader("student.txt"));
  67. String line;
  68. while ((line=br.readLine())!=null){
  69. System.out.println(line);
  70. }
  71. br.close();
  72. }
  73. //2封装一个方法用于添加学生信息
  74. public static void addStudent() throws IOException {
  75. //创建集合
  76. ArrayList<Student> array = new ArrayList<Student>();
  77. BufferedReader br=new BufferedReader(new FileReader("student.txt"));
  78. String line;
  79. while ((line=br.readLine()) != null){
  80. String[] strArr=line.split(",");
  81. Student s=new Student(strArr[0], strArr[1],strArr[2],strArr[3]);
  82. array.add(s);
  83. }
  84. //键盘录入对象
  85. Scanner sc = new Scanner(System.in);
  86. //所有的对学生的操作都是基于id,所以我们把id属性放到循环的外面
  87. String id;
  88. //能够实现重复添加学生的信息,所以使用循环
  89. while (true) {
  90. //判断一下这个学号是不是已经存在
  91. System.out.println("请输入学号:");
  92. id = sc.nextLine();
  93. //定义一个标记--假设不存在
  94. boolean flag = false;
  95. //遍历学号--就是遍历数组
  96. for (int i = 0; i < array.size(); i++) {
  97. Student s = array.get(i);
  98. //获取学号
  99. if (s.getId().equals(id)) {
  100. flag = true;//学号存在
  101. break;
  102. }
  103. }
  104. //这个时候flag就是true
  105. if (flag) {
  106. System.out.println("你的学号已经被占用,请重新输入!");
  107. } else {
  108. break;
  109. }
  110. }
  111. //通过验证可以添加学生
  112. System.out.println("请输入学生姓名:");
  113. String name = sc.nextLine();
  114. System.out.println("请输入学生年龄:");
  115. String age = sc.nextLine();
  116. System.out.println("请输入学生住址:");
  117. String address = sc.nextLine();
  118. //创建学生对象
  119. Student s = new Student();
  120. //赋值
  121. s.setId(id);
  122. s.setName(name);
  123. s.setAge(age);
  124. s.setAddress(address);
  125. //把学生保存到集合中
  126. array.add(s);
  127. //把集合中的数据写入文件
  128. BufferedWriter bw = new BufferedWriter(new FileWriter("student.txt",true));
  129. String line1=s.getId()+","+s.getName()+","+s.getAge()+","+s.getAddress();
  130. bw.write(line1);
  131. bw.newLine();
  132. bw.flush();
  133. bw.close();
  134. br.close();
  135. //给出提示
  136. System.out.println("添加学生成功!");
  137. }
  138. //3封装一个方法用于删除学生信息
  139. public static void deleteStudent() throws IOException {
  140. BufferedReader br=new BufferedReader(new FileReader("student.txt"));
  141. //创建集合
  142. ArrayList<Student> array = new ArrayList<Student>();
  143. String line;
  144. while ((line=br.readLine()) != null){
  145. String[] strArr=line.split(",");
  146. Student s=new Student(strArr[0], strArr[1],strArr[2],strArr[3]);
  147. array.add(s);
  148. }
  149. //删除学生的思路:键盘录入一个学号,到集合中去查找,看是否有学生使用的是该学号,如果有就删除该学生
  150. //创建键盘录入对象
  151. Scanner sc = new Scanner(System.in);
  152. System.out.println("请输入你要删除的学生的学号:");
  153. String id = sc.nextLine();
  154. //遍历集合看看这个id所对应的学生是不是存在--设置一个索引
  155. int index = -1;
  156. for (int i = 0; i < array.size(); i++) {
  157. //获取每一个学生
  158. Student s = array.get(i);
  159. //判断学生的学号和键盘录入的id进行比较
  160. if (s.getId().equals(id)) {//要删除的对象存在
  161. index = i;
  162. break;
  163. }
  164. }
  165. if (index == -1) {
  166. System.out.println("抱歉!你要删除的学号对应的学生信息不存在,请回去重新你的选择");
  167. } else {
  168. array.remove(index);
  169. System.out.println("删除成功!");
  170. }
  171. BufferedWriter bw = new BufferedWriter(new FileWriter("student.txt"));
  172. for (int i = 0; i <array.size(); i++) {
  173. String s=array.get(i).getId()+","+array.get(i).getName()+","+array.get(i).getAge()+","+array.get(i).getAddress();
  174. bw.write(s);
  175. bw.newLine();
  176. }
  177. bw.close();
  178. br.close();
  179. }
  180. //4封装一个方法用于修改学生信息
  181. public static void updateStudent() throws IOException {
  182. BufferedReader br=new BufferedReader(new FileReader("student.txt"));
  183. //创建集合
  184. ArrayList<Student> array = new ArrayList<Student>();
  185. String line;
  186. while ((line=br.readLine()) != null){
  187. String[] strArr=line.split(",");
  188. Student s=new Student(strArr[0], strArr[1],strArr[2],strArr[3]);
  189. array.add(s);
  190. }
  191. //修改学生的思路:键盘录入一个学号,到集合中去查找,看是否有学生使用的是该学号,如果有就修改该学生
  192. //创建键盘录入对象
  193. Scanner sc = new Scanner(System.in);
  194. System.out.println("请输入你要修改的学生的学号:");
  195. String id = sc.nextLine();
  196. //遍历集合看看这个id所对应的学生是不是存在--设置一个索引
  197. int index = -1;
  198. for (int i = 0; i < array.size(); i++) {
  199. //获取每一个学生
  200. Student s = array.get(i);
  201. //判断学生的学号和键盘录入的id进行比较
  202. if (s.getId().equals(id)) {//要修改的对象存在
  203. index = i;
  204. break;
  205. }
  206. }
  207. if (index == -1) {
  208. System.out.println("抱歉!你要修改的学号对应的学生信息不存在,请回去重新你的选择");
  209. } else {
  210. //开始进行修改
  211. System.out.println("请输入新的学生姓名:");
  212. String name = sc.nextLine();
  213. System.out.println("请输入新的学生年龄:");
  214. String age = sc.nextLine();
  215. System.out.println("请输入新的学生住址:");
  216. String address = sc.nextLine();
  217. //创建一个新的对象
  218. Student s = new Student();
  219. s.setId(id);
  220. s.setName(name);
  221. s.setAge(age);
  222. s.setAddress(address);
  223. //修改集合中的学生对象--实际上就是把原来的信息替换
  224. array.set(index, s);
  225. System.out.println("修改成功!");
  226. }
  227. BufferedWriter bw = new BufferedWriter(new FileWriter("student.txt"));
  228. for (int i = 0; i <array.size(); i++) {
  229. String s=array.get(i).getId()+","+array.get(i).getName()+","+array.get(i).getAge()+","+array.get(i).getAddress();
  230. bw.write(s);
  231. bw.newLine();
  232. }
  233. bw.close();
  234. br.close();
  235. }
  236. }