Java中的IO

289 阅读2分钟

这是我参与11月更文挑战的第5天,活动详情查看:2021最后一次更文挑战

Java-IO.png

解释

什么是 IO?I(Input),CPU 从外部读取数据;O(Output),从 CPU 向外部输出数据。

IO 分类

  1. 按功能 / 流向划分:

输入流:只能读数据,不能写数据,以 InputStream / Reader 为基类的流都属于输入流。

输出流:只能写数据,不能读数据,以 OutputStream / Writer为基类的流都属于输出流。

  1. 按处理单元划分:

字节流:读写字节,读写单位为 byte,因此可能会出现乱码,基类为 InputStream / OutputStream。字节流没有缓冲区,是直接输出的。

字符流:读写字符,可以逐个字符读取,也可逐行读取,基类为 Reader / Writer。在处理文本时优先使用字符流,其他数据类型使用字节流。字符流使用了缓冲区,因此只有在调用 close() 方法关闭缓冲区时,信息才会输出,若想在字符流未关闭时输出信息,则需要调用 flush() 方法。

  1. 按角色划分:

节点流(低级流):直接从外部设备中读写数据。

处理流(高级流):处理已存在的流,不单独存在,如:BufferedInputStream。

流转换

字节流与字符流是可以相互转换的。

  1. OutputStreamWriter 可将字符流转为字节流。
OutputStreamWriter osw = new OutputStreamWriter(
    new FileOutputStream(
        new File("file")), "UTF-8");
  1. InputStreamReader 可将字节流转为字符流。
InputStreamReader inr = new InputStreamReader(
    new FileInputStream(
        new File("file")), "UTF-8");

IO 使用总结

IO 的 API 十分繁杂,不过设计很合理,因此很容易就可以根据需求选择合适的 API。首先可以根据操作的 IO 是否是用来处理文本的,以此来选择使用字符流还是字节流,然后根据当前操作是读还是写,来选择流向,最后根据操作的类型,选择具体的实现类,如:读取文件就可以使用 FileReader。

IO-应用场景.png