节点流和处理流

  1. 节点流可以从一个特定的数据源读写数据,如FileReader、FileWriter
  2. 处理流(也叫包装流)是“连接”在已存在的流(节点流或处理流)之上,为程序提供更强大的读写功能,如BufferedReader、BufferedWriter alt text

节点流和处理流的区别和联系

  1. 节点流是底层流/低级流,直接跟数据源相接。
  2. 处理流包装节点流,既可以消除不同节点流的实现差异,也可以提供更方便的方法来完成输入输出。
  3. 处理流(也叫包装流)对节点流进行包装,使用了修饰器设计模式,不会直接与数据源相连

处理流的功能体现在

  1. 性能的提高:主要以增加缓冲的方式来提高输入输出的效率。
  2. 操作的便捷:处理流可能提供了一系列便捷的方法来一次输入输出大批量的数据,使用更加灵活方便

BufferedReader和BufferedWriter

二者属于字符流,按照字符来读取数据 ,不要读二进制文件(声音、视频、doc、pdf等),会造成文件损坏 关闭时,只需关闭外层流即可

Buffered字节处理流 BufferedInputStream和BufferedOutputStream

alt text alt text

对象流-ObjectInputStream和ObjectOutputStream

序列化和反序列化

  1. 序列化就是在保存数据时,保存数据的值和数据类型
  2. 反序列化就是在恢复数据时,恢复数据的值和数据类型
  3. 需要让某个对象支持序列化机制,则必须让其类是可序列化的,为了让某个类是可序列化的,该类必须实现如下两个接口之一:
    1. Serializable //这是一个标记接口,没有方法
    2. Externalizable //该接口有方法需要实现,因此我们一般实现上面的Serializable接口

基本介绍

  1. 功能:提供了对基本类型或对象类型的序列化和反序列化方法
  2. ObjectInputStream提供序列化功能
  3. ObjectOutputStream提供反序列化功能

注意事项

  1. 读写顺序要一致
  2. 要求实现序列化或反序列化对象,需要实现Serializable
  3. 序列化的类中建议添加SerialVersionUID,为了提高版本的兼容性
  4. 序列化对象时,默认将里面所有属性都进行序列化,但除了static或transient修饰的成员
  5. 序列化对象时,要求里面属性的类型也需要实现序列化接口
  6. 序列化具备可继承性,也就是如果某类实现了序列化,其所有子类也默认实现了序列化

标准输入输出流

& 类型 默认设备
System.in 标准输入 InputStream 键盘
System.out 标准输出 PrintStream 显示器

System.in

System类的public final static InputStream in = null;
System.in 编译类型 InputStream
System.in 运行类型 BufferedInputStream

System.out

System类的public final static PrintStream out = null;
System.out 编译类型 PrintStream
System.out 运行类型 PrintStream

转换流 InputStreamReader和OutputStreamWriter

将字节流转成字符流

需求:

BufferedReader读取文件按照utf-8编码,读取其他编码方式的文件会出现乱码

介绍

  1. InputStreamReader: Reader的子类,可以将InputStream(字节流)包装城Reader(字符流)
  2. OutputStreamWriter:Writer的子类,实现将OutputStream(字节流)包装成Writer(字符流)
  3. 当处理纯文本数据时,如果字符流效率更高,并且可以有效解决中文问题,所以建议将字节流转换成字符流
  4. 可以在使用时指定编码格式(比如 uft-8, gbk, gb2312, ISO8859-1 等)

打印流 PrintStream和PrintWriter

打印流只有输出流

PrintStream-字节流 PrintWriter-字符流


本文章使用limfx的vscode插件快速发布