1. 本章学习目标:理解IO流作用,分清字节流与字符流;掌握标准输入输出流、文件字节/字符流读写;学会缓冲流、Scanner工具类使用;熟悉File类操作文件与目录;了解NIO通道、缓冲区、对象序列化机制。

2. IO流即输入输出流,是有序字节序列,分为输入流、输出流。输入流只能读取数据,输出流只能写入数据。

3. 字节流以单个字节为读写单位,可处理任意类型文件;字符流以字符为单位,仅适合文本文件读写。

4. 字节流顶层抽象父类:InputStream(输入)、OutputStream(输出);字符流顶层抽象父类:Reader(输入)、Writer(输出)。

5. 标准输入输出流
5.1 System.in:标准控制台输入流,InputStream类型,默认接收键盘录入数据。
5.2 System.out:标准控制台输出流,PrintStream类型,常用print、println打印内容。
5.3 System.err:标准错误输出流,专门打印异常、错误提示信息。

6. Scanner工具类封装标准输入流,可便捷读取整数、浮点数、字符串,无需手动处理底层IO异常。

7. 格式化输出
7.1 System.out.printf支持占位符格式化输出,可指定数值、日期、字符串展示样式。
7.2 String.format方法仅生成格式化字符串,不会直接打印到控制台。

8. File类作用:不操作文件内容,仅用于获取文件/目录属性、创建、删除、重命名、遍历目录。

9. File类常用构造方法:传入文件完整路径字符串构建对象;父路径File对象加子文件名拼接路径。

10. File类常用基础方法
10.1 exists():判断文件或目录是否存在;isFile()判断是否为普通文件;isDirectory()判断是否为文件夹。
10.2 getName()获取文件名;getAbsolutePath()获取绝对路径;getParent()获取上级目录路径。
10.3 createNewFile()新建空文件;mkdir()创建单层目录;mkdirs()多级目录一并创建。
10.4 delete()删除文件或空文件夹;length()获取文件字节大小。

11. 目录遍历:list()返回目录下所有子名称字符串数组;listFiles()返回File对象数组,可搭配文件过滤器筛选指定类型文件。

12. 文件字节流
12.1 FileInputStream:文件字节输入流,按字节读取文件,文件不存在抛出FileNotFoundException。
12.2 FileOutputStream:文件字节输出流,写入字节到文件,第二个布尔参数true代表追加写入,false覆盖原有内容。
12.3 单个字节读写效率极低,一般采用字节数组批量读写数据。

13. 缓冲字节流
13.1 BufferedInputStream、BufferedOutputStream自带内置缓冲区,减少磁盘IO次数,大幅提升读写效率。
13.2 缓冲区数据未满时不会自动写入磁盘,调用flush()强制刷新缓冲区,close()关闭流时自动刷新。

14. 字符流桥梁转换类
14.1 InputStreamReader:字节输入流转字符输入流,可指定编码格式。
14.2 OutputStreamWriter:字符输出流转字节输出流,解决编码不一致乱码问题。

15. 字符文件流FileReader、FileWriter,简化文本文件字符读写,无法自定义编码。

16. 缓冲字符流BufferedReader、BufferedWriter,提供readLine()按行读取文本、newLine()换行专属方法,读写效率更高。

17. PrintWriter便捷打印字符输出流,可直接写入字符串、基本类型数据,自动换行,常用于日志、文本写入。

18. 字符编码转换:不同操作系统默认编码不同,读写文本不统一指定编码极易出现中文乱码,推荐统一使用UTF-8。

19. NIO高级流处理
19.1 NIO采用通道Channel+缓冲区Buffer模型,非阻塞IO,吞吐量优于传统BIO字节流。
19.2 Buffer缓冲区核心属性:capacity总容量、limit读写界限、position当前操作下标、mark标记位置。
19.3 FileChannel文件通道,配合Buffer完成文件读写、分片复制,支持文件锁定。

20. Path与Paths、Files工具类(NIO)
20.1 Path封装文件路径,Paths.get()快速构建路径对象。
20.2 Files工具类内置静态方法,一键实现文件复制、移动、删除、遍历目录、属性读取。

21. 对象序列化与反序列化
21.1 序列化:把内存Java对象写入文件/网络流持久保存;反序列化:从字节流还原为Java对象。
21.2 实体类必须实现Serializable标记接口才可序列化,可自定义serialVersionUID固定版本号。
21.3 ObjectOutputStream:writeObject()序列化对象输出;ObjectInputStream:readObject()读取并反序列化对象。
21.4 transient修饰成员变量,不会参与序列化,读取后该字段为默认初始值。

22. IO流通用规范:流使用完毕必须调用close()关闭释放系统资源;优先try-with-resources语法自动关闭流,无需手动书写close方法。

更多推荐