Java-IO

118 阅读2分钟

记录

日期说明
2023/1/1首次创建
2023/2/18增加带缓存的输入输出

总纲

针对java的io流做一些简单的总结

重点概念

  1. 字节流:一切文件在系统中国都是以字节的形式存储的
  2. buffered:在内存中建立缓存区,先把存储介质中的字节读取到缓存区。CPU需要数据时直接从缓存区读取就行。缓存区需要足够大。在被读取完后又触发fill()函数自动从存储介质的文件字节内容中读取字节存储到缓存区。 BufferedInputStrea内部的缓存区大小为8M,效率较高。
  3. 字符流:创建时指定流的编码形式,使得读取到的字节序列根据其在系统中保存时采用的编码格式进行解码,然后把解析好的字符交给Java虚拟机使用,这样就避免了文件所在的系统与Java虚拟机解码不一样导致乱码。默认使用unicode进行编码。

选择方法

  1. 输入/输出
  2. 字符/字节
  3. 对象:文件、数组、String、socket
  4. 是否需要转换
  5. 是否需要缓冲提高效率

序列化

  1. 序列化把对象转化为可以传输的状态(字节序列),反序列化是把传输状态的数据转换为对象
  2. 场景
  • 把内存中的状态保存到文件或数据库中
  • 在网络上传递对象
  • 通过RMI(?)传递对象
  1. 实现方法
  • 3.1 实现Serializable接口
    • 除static和transient修饰的都会自动保存,如果想要自动保存,可以重写writeObject和readObject方法?
    • 对于socket,thread类,不支持序列化,如果想要支持,就用static或transient修饰,并重写writeObject和readObject方法
    • transient
      • 被修饰的变量不会被持久化
      • 只能修饰可序列化变量,不能修饰类和方法
  • 3.2 实现Externalizable接口

非流式结构

  1. File
  2. RandonAccessFile

流式结构

  1. 概念
  • 1.1 从源节点到目的节点的有序数据?
    • 流是存储节点上的有序数据
    • 流必须具有流动性
    • 流是由静态数据转换而来的
    • 节点上的静态数据叫节点数据,转换为流之后叫节点流,存在流的节点称为流节点
  • 1.2 生命周期
graph TD
静态的节点数据,源 --> 动态的节点流源节点,源节点 --> 流动 --> 动态的节点流,目标节点 --> 静态的节点数据,目标
  1. 字节流
  • 2.1 inputStream
    • FileInputStream
    • FilterInputStream
      • BufferedInputStream
      • DataInputStream
      • PushBackInputStream
      • LineNumberInputStream
    • PipedInputStream
    • SequenceInputStream
    • StringBufferInputStream
    • ByteArrayInputStream
    • ObjectInputStream
    • ...
  • 2.2 outputStream
    • FileOutputStream
    • FilterOutputStream
      • BufferedOutputStream
      • DataOutputStream
      • PrinStream
    • PipedOutputStream
    • ByteArrayOutputStream
    • ObjectOutputStream
    • ...
  1. 字符流
  • 3.1 Reader
    • FileReader
    • StringReader
    • PipedReader
    • CharArrayReader
    • InputStreamReader(将字节流转换成字符流)
    • BufferedReader
    • ...
  • 3.2 Writer
    • FileWriter
    • StringWriter
    • PipedWriter
    • CharArrayWriter
    • OutputStreamWriter
    • BufferedWriter
    • PrinterWriter
    • ...
  1. 带缓存的输入输出