I/O(一)

一、前言

在这里插入图片描述
Java当中的I/O流使用了装饰器模式,他将I/O流分为底层节点流上层处理流,其中节点流和底层的物理节点直接关联——不同的物理节点获取结点流的方式可能存在一定差异,但Java把不同的节点流包装成统一的处理流,从而允许程序使用统一的输入输出代码来读取不同物理存储节点的资源。

二、理解I/O流
  1. 输入、输出流都是从内存的角度划分的。
  2. 字符流和字节流的用法几乎完全一样。区别在于所操作的数据单元不同——字节流操作的数据单元是8位的字节,字符流操作的数据单元是16位的字符。字节流主要以InputStream和OutputStream作为基类,而字符流主要以Reader和Writer作为基类。
  3. 处理流的功能主要体现在以下两个方面:
    • 性能的提高:主要以增加缓冲的方式来提高输入输出效率
    • 操作的便捷:处理流可能提供了一系列便捷的方法来一次输入输出大批量的内容
  4. 使用完输入输出流后要记得关闭流。对于输出流来书,关闭流除了保证流的物理资源被回收外还可以将缓冲区的中的数据flush到物理节点当中。Java7改写了所有的IO资源类,他们都实现了AutoCloseable接口,因此都可以自动关闭资源的try语句来关闭这些IO流。
三、输入/输出流体系
  1. 处理流的用法
    • 使用处理流来包装节点流,程序通过处理流来执行输入/输出功能,让节点流来与底层IO设备交互。
    • 识别处理流的关键在于他的构造器参数是物理节点还是一个已存在的流。
    • 关闭处理流的同时其包装的节点流也被关闭。
  2. 常用的流
    在这里插入图片描述
  1. 如果进行输入输出的内容是文本内容,则应考虑使用字符流
  2. 如果是二进制内容,则应考虑字节流
  3. 对于缓冲流来说,虽然提高了输入输出效率,但是需要使用flush()才能将缓冲区的内容写到物理节点中
  4. 对象流的作用主要用于实现对象的序列化
  1. 转换流
    1. InputStreamReader——将字节输入流转换为字符输入流
    2. OutputStreamWriter——将字符输出流转换为字节输出流
  2. 推回输出流
    • PushbackInputStream和PushbackReader
    • 上述两种流在构造时需要指定退回缓冲区的大小,默认推回缓冲区的大小为1。每次调用这两种流的read方法时,总是先从退回缓冲区中读取推回的内容,当推回缓冲区的内容读完之后才从原输入流中读取。
四、RandomAccessFile
  1. RandomAccessFile是输入输出体系中功能最丰富的文件访问类,它既可以读取文件内容也可以向文件中输出数据。与普通IO流不同的是,它支持随机访问的方式访问文件,即可以直接跳转到文件的任意地方来读写数据。缺点是它只能用于读、写文件,不能读写其他IO节点
  2. RandomAccessFile构造器中的mode参数(有以下4个值)
    1. “r”——以只读的方式打开指定文件
    2. “rw”——以读、写的方式打开指定文件,若文件不存在则新建文件
    3. “rws”——以读、写的方式打开指定文件,相较于"rw",还要求对文件内容或元数据每个更新都同步写入底层存储设备
    4. “rwd”——以读、写的方式打开指定文件,相较于"rw",还要求对文件内容每个更新都同步写入底层存储设备
  3. 注意: RandomAccessFile不能向文件的指定位置插入内容,如果直接将指针移动到文件中间位置并输出,则新输出的内容会覆盖原有内容。若想插入内容,则需要事先存储插入位置之后的内容,在插入完成后将存储的内容写回原文件。

猜你喜欢

转载自blog.csdn.net/qq_42451178/article/details/113094923
I/O