这是我参与11月更文挑战的第5天,活动详情查看:2021最后一次更文挑战
解释
什么是 IO?I(Input),CPU 从外部读取数据;O(Output),从 CPU 向外部输出数据。
IO 分类
- 按功能 / 流向划分:
输入流:只能读数据,不能写数据,以 InputStream / Reader 为基类的流都属于输入流。
输出流:只能写数据,不能读数据,以 OutputStream / Writer为基类的流都属于输出流。
- 按处理单元划分:
字节流:读写字节,读写单位为 byte,因此可能会出现乱码,基类为 InputStream / OutputStream。字节流没有缓冲区,是直接输出的。
字符流:读写字符,可以逐个字符读取,也可逐行读取,基类为 Reader / Writer。在处理文本时优先使用字符流,其他数据类型使用字节流。字符流使用了缓冲区,因此只有在调用 close() 方法关闭缓冲区时,信息才会输出,若想在字符流未关闭时输出信息,则需要调用 flush() 方法。
- 按角色划分:
节点流(低级流):直接从外部设备中读写数据。
处理流(高级流):处理已存在的流,不单独存在,如:BufferedInputStream。
流转换
字节流与字符流是可以相互转换的。
- OutputStreamWriter 可将字符流转为字节流。
OutputStreamWriter osw = new OutputStreamWriter(
new FileOutputStream(
new File("file")), "UTF-8");
- InputStreamReader 可将字节流转为字符流。
InputStreamReader inr = new InputStreamReader(
new FileInputStream(
new File("file")), "UTF-8");
IO 使用总结
IO 的 API 十分繁杂,不过设计很合理,因此很容易就可以根据需求选择合适的 API。首先可以根据操作的 IO 是否是用来处理文本的,以此来选择使用字符流还是字节流,然后根据当前操作是读还是写,来选择流向,最后根据操作的类型,选择具体的实现类,如:读取文件就可以使用 FileReader。