暑期自学 Day 05 | File 类 和 IO 流(五)

用缓冲流复制文件(读写文件)

  • 示例代码如下:
    try(BufferedInputStream bis = new BufferedInputStream(new FileInputStream("d://test//in.txt");
    BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("d://test//out.txt"))) {
      int len = 0;
      byte[] bytes = new bytes[1024]; // 用于连续读取的字节数组
      while ((len = bis.read(bytes)) != -1) {
          bos.write(bytes, 0, len);
      }
    } catch (IoException e) {
      e.printStackTrace();
    }

字符缓冲流 (BufferedRead, BufferedWriter)

  • 构造方法和字节缓冲流一样,使用方法和字符流一样。
  • 特有方法
    • BufferedWriter: public void newLine() 换行分隔符方法
    • BUfferedReader: public String readLine() 读取一整行,到行末尾返回空

转换流 (InputStreamReader, OutputStreamWriter)

  • 为了解决编码乱码问题

  • 除了查询默认码表 UTF-8:

    • InputStreamReader 也可以查询指定码表,将字节流转换为字符流。子类:FileReader
    • OutputStreamWriter 查询指定码表,将字符流转换为字节流。子类:FileWriter
  • 使用示例:

      // 使用时均要声明 IOException 异常
    
      // OutputStreamWriter
      // 将字节输出流传递进osw,指定编码格式
      OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("d://test.txt"), "utf-8");
      // 将字符串写入
      osw.write("你好");
      // 刷新释放资源
      osw.flush();
      osw.close();
    
      // InputStreamReader
      // 将字节输入流传递进isr,指定解码格式
      InputStreamReader isr = new InputStreamReader(new FileInputStream("d://test.txt"),"utf-8");
      int len = 0;
      byte[] bytes = new byte[1024];
      while ((len = isr.read(bytes)) != -1) {
          System.out.println((char)len);
      }
      isr.close();

序列化和反序列化

  • 序列化:把对象以流的形式写入到文件保存;ObjectOutputStream
  • 反序列化:把文件中保存的对象用流的形式读取出来;ObjectInputStream
  • 进行序列化反序列化时,必须实现 Serializable 接口。
    序列化流 ObjectOutputStream
  • 继承了字节输出流
  • 特有成员方法
    • void writeObject(Object obj)
反序列化流 ObjectInputStream
  • 继承了字节输入流
  • 特有成员方法
    • void readObject(Object obj)
    • 使用时要抛出 ClassNotFoundException
瞬态关键字 (transient)
  • 静态关键字不属于对象,无法被序列化。
  • 使用 transient 修饰变量,可以使成员变量不被序列化。
InvalidClassException
  • 序列化时会产生一个序列号,如果 class 中做了修改,反序列化时会造成序列号不一致,导致异常
  • 解决:在类中指定序列号,如:private static final long serialVersionUID = 1L;

打印流 (PrintStream)

  • System.out.println() 就是一个打印流
  • 不会抛出 IOException
  • 特有方法:print(), println(); 括号里可以打印任意数据类型
  • 构造方法:
    • PrintStream(File file)
    • PrintStream(String filename)
    • PrintStream(OutputStream out)
    • 可以看出,打印流既可以输出到文件,也可以输出到流对象
  • 继承了父类 write(), read(), flush(), close() 等方法。
  • 代码示例:
PrintStream ps = new PrintStream("d://test.txt"); // 要处理 FileNotFoundException
ps.write(97); // a
ps.println(97); // 97
System.setOut(ps); // 使打印流在目的地文件中输出
System.out.print(97); // test.txt 中打印 97
ps.close();
本作品采用《CC 协议》,转载必须注明作者和本文链接
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!