Java-进阶-day09-IO流_02

Java进阶-day09-IO流_02

今日内容

  • 字节缓冲流
  • 编码表
  • 字符流

一.字节缓冲流

BufferedOutputStream_字节缓冲输出流

  • 总结:

    • 构造方法:

      • BufferedOutputStream(OutputStream out) 创建一个新的缓冲输出流,以将数据写入指定的底层输出流。
    • 成员方法:

      • public void close() :关闭此输出流并释放与此流相关联的任何系统资源。
      • public void flush() :刷新此输出流并强制任何缓冲的输出字节被写出。
      • public void write(byte[] b):将 b.length字节从指定的字节数组写入此输出流。
      • public void write(byte[] b, int off, int len) :从指定的字节数组写入 len字节,从偏移量 off开始输出到此输出流。
      • public abstract void write(int b) :将指定的字节输出流。
  • 使用步骤(重点)

    1. 创建FileOutputStream对象,构造方法中绑定要输出的目的地
    2. 创建BufferedOutputStream对象,构造方法中传递FileOutputStream对象对象,提高FileOutputStream对象效率
    3. 使用BufferedOutputStream对象中的方法write,把数据写入到内部缓冲区中
    4. 使用BufferedOutputStream对象中的方法flush,把内部缓冲区中的数据,刷新到文件中
    5. 释放资源(会先调用flush方法刷新数据,第4部可以省略)
  • 案例代码:

public class BufferStreamDemo {
    public static void main(String[] args) throws IOException {
        //字节缓冲输出流:BufferedOutputStream​(OutputStream out)
//        FileOutputStream fos = new FileOutputStream("myByteStream\\bos.txt");
//        BufferedOutputStream bos = new BufferedOutputStream(fos);
        /*
        BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("myByteStream\\bos.txt"));
        //写数据
        bos.write("hello\r\n".getBytes());
        bos.write("world\r\n".getBytes());
        //释放资源
        bos.close();
        */

        //字节缓冲输入流:BufferedInputStream​(InputStream in)
        BufferedInputStream bis = new BufferedInputStream(new FileInputStream("myByteStream\\bos.txt"));

        //一次读取一个字节数据
//        int by;
//        while ((by=bis.read())!=-1) {
//            System.out.print((char)by);
//        }

        //一次读取一个字节数组数据
        byte[] bys = new byte[1024];
        int len;
        while ((len=bis.read(bys))!=-1) {
            System.out.print(new String(bys,0,len));
        }

        //释放资源
        bis.close();
    }
}

BufferedInputStream_字节缓冲输入流

  • 总结:
    • 构造方法:
      • BufferedInputStream(InputStream in) 创建一个 BufferedInputStream 并保存其参数,即输入流 in,以便将来使用。
    • 成员方法:
      • int read()从输入流中读取数据的下一个字节。
      • int read(byte[] b) 从输入流中读取一定数量的字节,并将其存储在缓冲区数组 b 中。
      • void close() 关闭此输入流并释放与该流关联的所有系统资源。
    • 使用步骤(重点):
      • 1.创建FileInputStream对象,构造方法中绑定要读取的数据源
      • 2.创建BufferedInputStream对象,构造方法中传递FileInputStream对象,提高FileInputStream对象的读取效率
      • 3.使用BufferedInputStream对象中的方法read,读取文件
      • 4.释放资源

字节流复制视频

  • 案例需求:

    把“E:\itcast\字节流复制图片.avi”复制到模块目录下的“字节流复制图片.avi”

  • 步骤:

    • 根据数据源创建字节输入流对象
    • 根据目的地创建字节输出流对象
    • 读写数据,复制视频
    • 释放资源
  • 案例代码:

/*
    需求:
        把E:\\itcast\\字节流复制图片.avi 复制到模块目录下的 字节流复制图片.avi

    思路:
        1:根据数据源创建字节输入流对象
        2:根据目的地创建字节输出流对象
        3:读写数据,复制图片(一次读取一个字节数组,一次写入一个字节数组)
        4:释放资源

    四种方式实现复制视频,并记录每种方式复制视频的时间
        1:基本字节流一次读写一个字节             共耗时:64565毫秒
        2:基本字节流一次读写一个字节数组          共耗时:107毫秒
        3:字节缓冲流一次读写一个字节             共耗时:405毫秒
        4:字节缓冲流一次读写一个字节数组          共耗时:60毫秒
 */
public class CopyAviDemo {
    public static void main(String[] args) throws IOException {
        //记录开始时间
        long startTime = System.currentTimeMillis();

        //复制视频
//        method1();
//        method2();
//        method3();
        method4();

        //记录结束时间
        long endTime = System.currentTimeMillis();
        System.out.println("共耗时:" + (endTime - startTime) + "毫秒");
    }

    //字节缓冲流一次读写一个字节数组
    public static void method4() throws IOException {
        BufferedInputStream bis = new BufferedInputStream(new FileInputStream("E:\\itcast\\字节流复制图片.avi"));
        BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("myByteStream\\字节流复制图片.avi"));

        byte[] bys = new byte[1024];
        int len;
        while ((len=bis.read(bys))!=-1) {
            bos.write(bys,0,len);
        }

        bos.close();
        bis.close();
    }

    //字节缓冲流一次读写一个字节
    public static void method3() throws IOException {
        BufferedInputStream bis = new BufferedInputStream(new FileInputStream("E:\\itcast\\字节流复制图片.avi"));
        BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("myByteStream\\字节流复制图片.avi"));

        int by;
        while ((by=bis.read())!=-1) {
            bos.write(by);
        }

        bos.close();
        bis.close();
    }


    //基本字节流一次读写一个字节数组
    public static void method2() throws IOException {
        //E:\\itcast\\字节流复制图片.avi
        //模块目录下的 字节流复制图片.avi
        FileInputStream fis = new FileInputStream("E:\\itcast\\字节流复制图片.avi");
        FileOutputStream fos = new FileOutputStream("myByteStream\\字节流复制图片.avi");

        byte[] bys = new byte[1024];
        int len;
        while ((len=fis.read(bys))!=-1) {
            fos.write(bys,0,len);
        }

        fos.close();
        fis.close();
    }

    //基本字节流一次读写一个字节
    public static void method1() throws IOException {
        //E:\\itcast\\字节流复制图片.avi
        //模块目录下的 字节流复制图片.avi
        FileInputStream fis = new FileInputStream("E:\\itcast\\字节流复制图片.avi");
        FileOutputStream fos = new FileOutputStream("myByteStream\\字节流复制图片.avi");

        int by;
        while ((by=fis.read())!=-1) {
            fos.write(by);
        }

        fos.close();
        fis.close();
    }
}

二.编码表

为什么会出现字符流

  • 总结:

    • 读取中文时,使用字节流一次读取一个字节,会出现什么问题?
      • 会出现乱码, 一个汉字三个字节 一次读取一个字节,相当于把一个汉字三个字节拆分成了三个
    • utf-8 和 GBK占几个字节?
      • UTF-8: 占三个字节
      • GBK:占两个字节
  • 总结: 字符流 = 字节流 + 编码表

  • 编码表:

    • 什么是编码?
      • 将字符(看得懂的数据)转换成字节(看不懂的数据)
    • 什么是解码?
      • 将字节(看不懂的数据)转换成字符(看得懂的数据)
    • 什么是编码表?
      • 将计算机底层的二进制数据转换成我们能看的懂的字符(文字)
  • 常见的编码表有那些?

    • ASCII(掌握): 主要包括控制字符(回车键、退格、换行键等)和
      可显示字符(英文大小写字符、阿拉伯数字和西文符号)一共包含256个字符

    • ISO-8859-1: 拉丁码表 不包含中文

    • GB2312:简体中文码表

      • GBK(掌握):是在GB2312标准基础上的扩展规范 中文是用两个字节表示的
    • Unicode:

      • UTF-8编码表(掌握): 万国码
        • 拉丁文等字符,需要二个字节编码。
        • 大部分常用字(含中文),使用三个字节编码。

字符串中的编码解码问题

  • byte[] getBytes() : 使用平台的默认字符集将该 String编码为一系列字节

  • byte[] getBytes(String charsetName) : 使用指定的字符集将该 String编码为一系列字节

  • String(byte[] bytes) : 使用平台的默认字符集解码指定的字节数组来创建字符串

  • String(byte[] bytes, String charsetName) : 通过指定的字符集解码指定的字节数组来创建字符串

  • 总结:

    • 编码:

      • 使用字符串(String) 中的方法byte[] getBytes() 来进行编码.编码的同时我们还可以进行按照具体的字符集进行编码getBytes(“GBK|UTF-8”)
    • 解码:

      • 使用字符串中的构造方法 String(byte[] bytes)解码的同时我们还可以进行按照具体的字符集进行解码 String(byte[] bytes,“GBK|UTF-8”)
    • 编码 和 解码 必须要保持一致 否则就乱码了

  • 案例代码:

	/*
	    编码:
	        byte[] getBytes():使用平台的默认字符集将该 String编码为一系列字节,将结果存储到新的字节数组中
	        byte[] getBytes(String charsetName):使用指定的字符集将该 String编码为一系列字节,将结果存储到新的字节数组中

	    解码:
	        String(byte[] bytes):通过使用平台的默认字符集解码指定的字节数组来构造新的 String
	        String(byte[] bytes, String charsetName):通过指定的字符集解码指定的字节数组来构造新的 String

	    后期操作文本一些数据的时候,只要出现了一些看不懂的内容,说明就是乱码了
	    乱码该怎么解决?
	          只要保证操作数据源,和目的地的编码要保持一致,就能解决乱码的问题

	 */
	public class StringDemo {
	    public static void main(String[] args) throws UnsupportedEncodingException {
	        //定义一个字符串
	        String s = "中国";

	        //byte[] getBytes():使用平台的默认字符集将该 String编码为一系列字节,将结果存储到新的字节数组中
	        //byte[] bys = s.getBytes(); //[-28, -72, -83, -27, -101, -67]
	        //byte[] getBytes(String charsetName):使用指定的字符集将该 String编码为一系列字节,将结果存储到新的字节数组中
	//        byte[] bys = s.getBytes("UTF-8"); //[-28, -72, -83, -27, -101, -67]
	        byte[] bys = s.getBytes("GBK"); // [-42, -48, -71, -6]
	        System.out.println(Arrays.toString(bys));

	        //String(byte[] bytes):通过使用平台的默认字符集解码指定的字节数组来构造新的 String
	//        String ss = new String(bys);
	        //String(byte[] bytes, String charsetName):通过指定的字符集解码指定的字节数组来构造新的 String
	       // String ss = new String(bys,"UTF-8");
	        String ss = new String(bys,"GBK");
	        System.out.println(ss);
	    }
	}

字符流中的编码解码问题

  • OutputStreamWriter介绍

  • 总结:

    • OutputStreamWriter 概述和作用:

      • 将字节输出流转换成字符输出流
    • 如何记?

      • OutputStream 转 Writer 字节输出流 转 字符输出流 它是writer的子类
    • OutputStreamWriter的构造方法

      • OutputStreamWriter(OutputStream out)创建使用默认字符编码的 OutputStreamWriter。
      • OutputStreamWriter(OutputStream out, String charsetName) 创建使用指定字符集的 OutputStreamWriter。
    • 如何使用?

      • 1.创建OutputStreamWriter对象,构造方法中传递字节输出流和指定的编码表名称
      • 2.使用OutputStreamWriter对象中的方法write,把字符转换为字节存储缓冲区中(编码)
      • 3.使用OutputStreamWriter对象中的方法flush,把内存缓冲区中的字节刷新到文件中(使用字节流写字节的过程)
      • 4.释放资源
    • OutputStreamWriter 和 InputStreamReader 这两个类进行转换

  • InputStreamReader介绍

    • 总结
      • InputStreamReader概述和作用:

        • 将字节输入流转换成字符输入流
      • 如何记?

        • InputStream 转 Reader 字节输入流转字符输入流 方向要一致
      • InputStreamReader的构造方法

        • InputStreamReader(InputStream in) 创建一个使用默认字符集的 InputStreamReader。
        • InputStreamReader(InputStream in, String charsetName) 创建使用指定字符集的 InputStreamReader。
      • 如何使用

        • 1.创建InputStreamReader对象,构造方法中传递字节输入流和指定的编码表名称
        • 2.使用InputStreamReader对象中的方法read读取文件
        • 3.释放资源
  • 案例代码:

	/*
	    InputStreamReader:是从字节流到字符流的桥梁
	        它读取字节,并使用指定的编码将其解码为字符
	        它使用的字符集可以由名称指定,也可以被明确指定,或者可以接受平台的默认字符集

	    OutputStreamWriter:是从字符流到字节流的桥梁
	        是从字符流到字节流的桥梁,使用指定的编码将写入的字符编码为字节
	        它使用的字符集可以由名称指定,也可以被明确指定,或者可以接受平台的默认字符集
	 */
	public class ConversionStreamDemo {
	    public static void main(String[] args) throws IOException {
	//        OutputStreamWriter​(OutputStream out) 创建一个使用默认字符编码的OutputStreamWriter。
	//        OutputStreamWriter​(OutputStream out, String charsetName) 创建一个使用命名字符集的OutputStreamWriter。
	//        FileOutputStream fos = new FileOutputStream("myCharStream\\osw.txt");
	//        OutputStreamWriter osw = new OutputStreamWriter(fos);
	//        OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("myCharStream\\osw.txt"));
	        // 如果不指定具体的编码,默认用的是当前IDEA中的编码
	       // OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("myCharStream\\osw.txt"),"UTF-8");
	        OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("day09_code\\osw.txt"),"GBK");
	        osw.write("中国");
	        osw.close();

	//        InputStreamReader​(InputStream in) 创建一个使用默认字符集的InputStreamReader。
	//        InputStreamReader​(InputStream in, String charsetName) 创建一个使用命名字符集的InputStreamReader。
	          // 读取数据的时候,如果没有指定具体的编码,默认用的是当前IDEA中的编码
	//        InputStreamReader isr = new InputStreamReader(new FileInputStream("myCharStream\\osw.txt"));
	        InputStreamReader isr = new InputStreamReader(new FileInputStream("day09_code\\osw.txt"),"GBK");
	        //一次读取一个字符数据
	        int ch;
	        while ((ch=isr.read())!=-1) {
	            System.out.print((char)ch);
	        }

	        isr.close();
	    }
	}

字符流

字符输出流Writer

  • 概述

    • 字符输出流的抽象父类, 使用的话需要使用子类对象FileWriter
  • FileWriter的构造方法:

    • FileWriter(File file) : 将输出流关联的数据目的, 以file对象的形式给出

    • FileWriter(File file, boolean append) : 允许尾部追加

    • FileWriter(String fileName) : 将输出流关联的数据目的, 以String字符串的路径给出

    • FileWriter(String fileName, boolean append) : 允许尾部追加

  • FileWriter的一般方法 :

    • void write(int c) : 写入单个字符。
    • void write(char[] cbuf) : 写入字符数组。
    • void write(char[] cbuf, int off, int len)(重点掌握) : 写入字符数组的某一部分。
    • void write(String str)(重点掌握) : 写入字符串。
    • void write(String str, int off, int len) : 写入字符串的某一部分。
    • void flush() : 刷新该流的缓冲。
    • void close() : 关闭此流,但要先刷新它。
  • flush与close区别

    • flush : 刷新缓冲区,还可以跟着在写数据
    • close : 关闭流,就不能再写数据了
    • 以后建议大家: 写一个数据进行刷新一次,不要进行全部复制完毕之后,在进行close

字符输入流 Reader

  • Reader概述 :

    • 总结: 用于读取字符的便捷类
  • FileReader构造方法:

    • FileReader(File file) : 将要读取的数据源, 使用file对象的形式给出
    • FileReader(String fileName) : 将要读取的数据源, 以字符串的形式给出.
  • FileReader的成员方法:

    • int read() : 一次读取一个字符
    • int read(char[] cbuf) : 一次读取一个字符数组

字符流复制Java文件

  • 使用 InputStreamReader 和 OutputStreamWriter 复制文本文件
  • 案例需求:

    把模块目录下的“ConversionStreamDemo.java” 复制到模块目录下的“Copy.java”

  • 实现步骤

    • 根据数据源创建字符输入流对象
    • 根据目的地创建字符输出流对象
    • 读写数据,复制文件
    • 释放资源
  • 案例代码:

public class CopyFile {
    public static void main(String[] args) throws IOException {
        // 创建 InputStreamReader 读取源文件 day09_code\BufferStreamDemo.java
        InputStreamReader isr = new InputStreamReader(new FileInputStream(new File("day09_code\\BufferStreamDemo.java")));
        // 创建OutputStreamWriter 写入目的地 day09_code\copy.java
        OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream(new File("day09_code\\copy.java")));

        // 一次读取一个字符
       /* int ch;
        while ((ch = isr.read()) != -1) {
            osw.write(ch);
        }*/

        // 一次读取一个字符数组
        char[] chs = new char[1024];
        int ch;
        while ((ch = isr.read(chs)) != -1) {
            osw.write(chs,0,ch);
            // osw.flush();
        }

        // 释放资源
        osw.close();
        isr.close();



    }
}

  • 使用 FileReader 和 FileWriter 复制文本文件
  • 案例需求:

    把模块目录下的“ConversionStreamDemo.java” 复制到模块目录下的“Copy.java”

  • 实现步骤

    • 根据数据源创建字符输入流对象
    • 根据目的地创建字符输出流对象
    • 读写数据,复制文件
    • 释放资源
  • 案例代码:

public class CopyFile2 {
    public static void main(String[] args) throws IOException {
      // 使用 FileReader  FileWriter
        FileReader isr = new FileReader(new File("day09_code\\BufferStreamDemo.java"));
        FileWriter osw = new FileWriter(new File("day09_code\\copy.java"));
        // 一次读取一个字符
       /* int ch;
        while ((ch = isr.read()) != -1) {
            osw.write(ch);
        }*/

        // 一次读取一个字符数组
        char[] chs = new char[1024];
        int ch;
        while ((ch = isr.read(chs)) != -1) {
            osw.write(chs,0,ch);
            // osw.flush();
        }

        // 释放资源
        osw.close();
        isr.close();
    }
}

字符缓冲输出流和输入流

  • 字符缓冲输出流 BufferedWriter(包装流)

    • 构造方法:
      • BufferedWriter(Writer out) 创建一个使用默认大小输出缓冲区的缓冲字符输出流。
  • 字符缓冲输入流 BufferedReader(包装流)

    • 构造方法:
      • BufferedReader(Reader in) 创建一个使用默认大小输入缓冲区的缓冲字符输入流。
  • 案例代码:


public class BufferedStreamDemo01 {
    public static void main(String[] args) throws IOException {
        //BufferedWriter(Writer out)
//        FileWriter fw = new FileWriter("myCharStream\\bw.txt");
//        BufferedWriter bw = new BufferedWriter(fw);
//        BufferedWriter bw = new BufferedWriter(new FileWriter("myCharStream\\bw.txt"));
//        bw.write("hello\r\n");
//        bw.write("world\r\n");
//        bw.close();

        //BufferedReader(Reader in)
        BufferedReader br = new BufferedReader(new FileReader("myCharStream\\bw.txt"));

        //一次读取一个字符数据
//        int ch;
//        while ((ch=br.read())!=-1) {
//            System.out.print((char)ch);
//        }

        //一次读取一个字符数组数据
        char[] chs = new char[1024];
        int len;
        while ((len=br.read(chs))!=-1) {
            System.out.print(new String(chs,0,len));
        }

        br.close();

    }
}

字符缓冲流复制Java文件

  • 案例需求
    把模块目录下的ConversionStreamDemo.java 复制到模块目录下的 Copy.java

  • 实现步骤

    • 根据数据源创建字符缓冲输入流对象
    • 根据目的地创建字符缓冲输出流对象
    • 读写数据,复制文件,使用字符缓冲流特有功能实现
    • 释放资源
public class CopyFile3 {
    public static void main(String[] args) throws IOException {
     
        BufferedReader isr = new BufferedReader(new FileReader(new File("day09_code\\BufferStreamDemo.java")));
        BufferedWriter osw = new BufferedWriter(new FileWriter(new File("day09_code\\buff.java")));
        // 一次读取一个字符
       /* int ch;
        while ((ch = isr.read()) != -1) {
            osw.write(ch);
        }*/

        // 一次读取一个字符数组
        char[] chs = new char[1024];
        int ch;
        while ((ch = isr.read(chs)) != -1) {
            osw.write(chs,0,ch);
            // osw.flush();
        }

        // 释放资源
        osw.close();
        isr.close();
    }
}

字符缓冲流的特殊功能

  • BufferedReader 的特殊功能:
    • readLine() : 一次读取一行,但是读取不到换行符
  • BufferedWriter的特殊功能:
    • newLine(): 写换行 跨平台的

字符缓冲流特有功能复制Java文件

  • 案例需求
    • 使用特有功能把模块目录下的ConversionStreamDemo.java 复制到模块目录下的 Copy.java
  • 实现步骤
    • 根据数据源创建字符缓冲输入流对象
    • 根据目的地创建字符缓冲输出流对象
    • 读写数据,复制文件,使用字符缓冲流特有功能实现
    • 释放资源
public class CopyFile4 {
    public static void main(String[] args) throws IOException {

        /*
           数据源: 原来的方式存在一个文件中
                   现在将数据存储在集合 或 数组
         */

        // 创建 BufferedReader 和 BufferedWriter
        BufferedReader br = new BufferedReader(new FileReader(new File("day09_code\\BufferStreamDemo.java")));
        BufferedWriter bw = new BufferedWriter(new FileWriter(new File("day09_code\\buff1.java")));

        // 使用 BufferedReader 和 BufferedWriter 特有功能复制文件
        String line;
        while ((line = br.readLine()) != null) {
            // 一次读取一行,写数据一次写一行
            bw.write(line);
            // 手动换行
            bw.newLine();
            // 刷新
            bw.flush();
        }
        bw.close();
        br.close();
    }
}

四.集合案例

  • 集合到文件
    * 案例需求
    把文本文件中的数据读取到集合中,并遍历集合。
    要求:文件中每一行数据是一个集合元素
  • 实现步骤

    • 创建ArrayList集合
    • 往集合中存储字符串元素
    • 创建字符缓冲输出流对象
    • 遍历集合,得到每一个字符串数据
    • 调用字符缓冲输出流对象的方法写数据
    • 释放资源
  • 案例代码:

public class ArrayListToTxtDemo {
    public static void main(String[] args) throws IOException {
        //创建ArrayList集合
        ArrayList<String> array = new ArrayList<String>();

        //往集合中存储字符串元素
        array.add("hello");
        array.add("world");
        array.add("java");

        //创建字符缓冲输出流对象
        BufferedWriter bw = new BufferedWriter(new FileWriter("myCharStream\\array.txt"));

        //遍历集合,得到每一个字符串数据
        for(String s : array) {
            //调用字符缓冲输出流对象的方法写数据
            bw.write(s);
            bw.newLine();
            bw.flush();
        }

        //释放资源
        bw.close();
    }
}

  • 文件到集合
  • 案例需求
    • 把ArrayList集合中的字符串数据写入到文本文件。要求:每一个字符串元素作为文件中的一行数据
  • 实现步骤
    • 创建字符缓冲输入流对象
    • 创建ArrayList集合对象
    • 调用字符缓冲输入流对象的方法读数据
    • 把读取到的字符串数据存储到集合中
    • 释放资源
    • 遍历集合
public static void main(String[] args) {
	// 创建字符缓冲输入流对象
        BufferedReader br = new BufferedReader(new FileReader("day09_code\\array.txt"));
        // 创建ArrayList集合对象
        ArrayList<String> list = new ArrayList<>();

        // 读取文件中的内容
        String line;
        while ((line = br.readLine()) != null) {
            // 将读取到的数据,添加到集合中
            list.add(line);
        }

        // 释放资源
        br.close();

	 // 遍历集合
    for (String s : list) {
        System.out.println(s);
    }

}

  • 点名器
  • 案例需求

    有一个文件里面存储了班级同学的姓名,每一个姓名占一行,要求通过程序实现随点名器

  • 实现步骤

    • 创建字符缓冲输入流对象
    • 创建ArrayList集合对象
    • 调用字符缓冲输入流对象的方法读数据
    • 把读取到的字符串数据存储到集合中
    • 释放资源
    • 使用Random产生一个随机数,随机数的范围在:[0,集合的长度)
    • 把第6步产生的随机数作为索引到ArrayList集合中获取值
    • 把第7步得到的数据输出在控制台
  • 文件到集合改进版
  • 案例需求

    • 把文本文件中的数据读取到集合中,并遍历集合。要求:文件中每一行数据是一个学生对象的成员变量值
      举例:itheima001,林青霞,30,西安
  • 实现步骤

    • 定义学生类
    • 创建字符缓冲输入流对象
    • 创建ArrayList集合对象
    • 调用字符缓冲输入流对象的方法读数据
    • 把读取到的字符串数据用split()进行分割,得到一个字符串数组
    • 创建学生对象
    • 把字符串数组中的每一个元素取出来对应的赋值给学生对象的成员变量值
    • 把学生对象添加到集合
    • 释放资源
    • 遍历集合
public class FileToArrayListDemo {
    public static void main(String[] args) throws IOException {
        //创建字符缓冲输入流对象
        BufferedReader br = new BufferedReader(new FileReader("myCharStream\\students.txt"));

        //创建ArrayList集合对象
        ArrayList<Student> array = new ArrayList<Student>();

        //调用字符缓冲输入流对象的方法读数据
        String line;
        while ((line = br.readLine()) != null) {
            /*
              line: itheima001,林青霞,30,西安
              String[] strArray = line.split(",");
               [0] : 学号
               [1] : 姓名
               [2] : 年龄  Integer.parseInt()
               [3] : 居住地

             */
            //把读取到的字符串数据用split()进行分割,得到一个字符串数组
            String[] strArray = line.split(",");

            //创建学生对象
            Student s = new Student();
            //把字符串数组中的每一个元素取出来对应的赋值给学生对象的成员变量值
            //itheima001,林青霞,30,西安
            s.setSid(strArray[0]);
            s.setName(strArray[1]);
            s.setAge(Integer.parseInt(strArray[2]));
            s.setAddress(strArray[3]);

            //把学生对象添加到集合
            array.add(s);
        }

        //释放资源
        br.close();

        //遍历集合
        for (Student s : array) {
            System.out.println(s.getSid() + "," + s.getName() + "," + s.getAge() + "," + s.getAddress());
        }
    }
}

你可能感兴趣的:(Java进阶)