章节7-IO流

90 阅读3分钟

继承结构

  • Closeable接口
    • 字节流: 处理没有中文的流
      • InputStream
        • FileInputStream: 从文件系统中的文件读取字节
        • ObjectInputStream: 用于反序列化对象。
      • OutputStream
        • FileOutputStream: 将字节写入文件系统中的文件
        • ObjectOutputStream: 用于序列化对象。(可以直接将对象写入到文件)
    • 字符流: 处理全中文的流, 由于中文不同的编码格式, 导致每个汉字占用的字节数不一致, 若使用字节流读取中文,则不好定义读取字节数, 容易造成乱码.
      • Reader
        • FileReader: 从文件系统中的文件读取字符。
        • BufferedReader: 为其他Reader添加缓冲功能。
        • InputStreamReader: 可以将字节流转换为字符流进行操作 , 可以指定读写的编码格式
      • Writer
        • FileWriter: 将字符写入文件系统中的文件。
        • BufferedWriter: 为其他Writer添加缓冲功能。
        • OutputStreamWriter: 同上

字节流

字节输出流 & 字节输入流

  • FileInputStream

    • 构造方法说明
      FileOutputStream(String name)输出流关联文件, 文件路径以字符串形式给出
      FileOutputStream(String name, boolean append)第二个参数是追加写入的开关
      FileOutputStream(File file)输出流关联文件, 文件路径以File对象形式给出
      FileOutputStream(File file, boolean append)第二个参数是追加写入的开关
    • FileInputStream fileInputStream = new FileInputStream("D:\\A.txt");
      int len = 0;
      //一次性全部读取, 当fileInputStream.read() == -1 代表读取结束
      while ((len = fileInputStream.read() != -1){
          System.out.print(s);
      }
      
  • ObjectInputStream

    • 基本同上

序列化流

  • 可以在流中,以字节的形式直接读写对象

  • /**
     * 使用序列化流存入多个对然后取出
     */
    @Test
    public void test02() throws IOException, ClassNotFoundException {
        Student stu1 = new Student("张三", "男", 12, 34);
        Student stu2 = new Student("李四", "男", 23, 31);
        Student stu3 = new Student("王五", "男", 41, 46);
    
        ArrayList<Student> list = new ArrayList<>();
        Collections.addAll(list,stu1,stu2,stu3);
    
        ObjectOutputStream weiteObject = new ObjectOutputStream(new FileOutputStream("D:\\A.txt"));
    
        weiteObject.writeObject(list);
    
        weiteObject.close();
    
        ObjectInputStream readerObject = new ObjectInputStream(new FileInputStream("D:\\A.txt"));
        
        ArrayList<Student> students = (ArrayList<Student>) readerObject.readObject();
        students.forEach(item -> System.out.println(item));
        
        readerObject.close();
    
    }
    

字符流

字符输入流 & 字符输出流

  • Reader

    • 构造方法说明
      FileWriter(String fileName)字符输出流关联文件,路径以字符串形式给出
      FileWriter(String fileName, boolean append)参数2: 追加写入的开关
      FileWriter(File file)字符输出流关联文件,路径以File对象形式给出
      FileWriter(File file, boolean append)参数2: 追加写入的开关
    • @Test
      public void test01() throws IOException {
          FileReader fileReader = new FileReader("D:\\A.txt");
      
          char[] chars = new char[1024]; //做了一个缓冲, 每次读取的字符数为1024个
          int len;
      
          while ((len = fileReader.read(chars)) != -1){
              String s = new String(chars, 0, len);
              System.out.println(s);
          }
      }
      
  • Writer

    • 同上

    • 成员方法说明
      public void write(int c)写出单个字符
      public void write(char[] cbuf)写出一个字符数组
      public write(char[] cbuf, int off, int len)写出字符数组的一部分
      public void write(String str)写出字符串
      public void write(String str, int off, int len)写出字符串的一部分
    • 注意: 字符输出流写出数据,需要调用flush或close方法,数据才会写出

字符缓冲流

  • 字符缓冲流在源代码中内置了字符数组,可以提高读写效率

  • 字符缓冲流中的特有方法

    • BufferedReader

      • public String readLine()读取一行字符串, 读取到末尾返回 null
    • BufferedWriter

      • public void newLine()写出换行符 (具有跨平台性)

转换流

  • 作用

    • 按照指定的字符编码读写操作
    • 将字节流转换为字符流进行操作
  • public static void main(String[] args) throws IOException {
        Properties pro = new Properties();
        pro.setProperty("品名","Iphone11 Pro Max");
        pro.setProperty("颜色","暗夜绿");
        pro.setProperty("存储容量","256G");
        pro.setProperty("价格","10899");
    
        OutputStreamWriter writer = new OutputStreamWriter(newFileOutputStream("D:\\A.txt"),"UTF-8");
        pro.store(writer,null);
    
        writer.close();
    }