Java IO核心内容
Java IO(Input/Output)用于处理设备间的数据传输,核心是“流”(Stream),即数据按顺序流动的通道,分为输入流(读数据)和输出流(写数据),且所有流都实现了 AutoCloseable 接口,推荐用 try-with-resources 自动关闭,避免资源泄漏。
一、IO 流的两大体系
Java IO 分为字节流和字符流,二者本质区别是处理数据的最小单位不同,需根据数据类型(二进制/文本)选择。
1. 字节流(处理二进制数据)
• 核心父类:InputStream(输入字节流,读数据)、OutputStream(输出字节流,写数据),均为抽象类,需用子类实例化。
• 常用子类:
◦ FileInputStream/FileOutputStream:读写本地文件,是文件操作的基础流,直接与文件交互。
◦ BufferedInputStream/BufferedOutputStream:带缓冲的字节流,通过内置缓冲区减少 IO 次数(避免频繁访问硬件),效率远高于普通字节流,实际开发中优先使用。
• 特点:可处理任何二进制数据(如图片、视频、音频、文件),是 IO 流的基础;读写文本时需手动处理编码(如 UTF-8),否则易乱码。
2. 字符流(处理文本数据)
• 核心父类:Reader(输入字符流,读文本)、Writer(输出字符流,写文本),同样是抽象类。
• 常用子类:
◦ FileReader/FileWriter:读写文本文件,默认使用系统编码(如 Windows 的 GBK),跨平台可能乱码,需谨慎使用。
◦ BufferedReader/BufferedWriter:带缓冲的字符流,效率高,且 BufferedReader 提供 readLine() 方法,可直接读取整行文本(无需手动拼接字符),是处理文本的常用选择。
◦ InputStreamReader/OutputStreamWriter:“字节流转字符流”的桥梁,可手动指定编码(如 new InputStreamReader(new FileInputStream("a.txt"), "UTF-8")),解决跨平台编码问题,是处理文本乱码的关键流。
• 特点:仅处理文本数据(如 .txt、.java 文件),自动处理编码转换,避免手动处理字节与字符的映射,适合文本读写场景。
二、核心设计模式:装饰者模式
Java IO 大量使用装饰者模式,通过“基础流 + 装饰流”的组合,灵活扩展功能,无需修改原有类。
• 基础流:直接与数据源/目的地交互的流(如 FileInputStream 直接读文件),功能简单。
• 装饰流:包裹基础流,添加额外功能(如缓冲、编码转换),如 BufferedInputStream 给 FileInputStream 加缓冲,InputStreamReader 给字节流加字符编码转换。
• 示例逻辑:new BufferedReader(new InputStreamReader(new FileInputStream("a.txt"), "UTF-8"))
(基础流 FileInputStream → 装饰流 InputStreamReader 转字符+指定编码 → 装饰流 BufferedReader 加缓冲+读整行)
三、常见问题与注意事项
1. 资源关闭:流属于稀缺资源,必须关闭(否则文件可能被占用)。try-with-resources 会自动调用 close() 方法,推荐写法:
try (InputStream in = new FileInputStream("a.txt")) { // 读写操作 } catch (IOException e) { e.printStackTrace(); }
2. 编码问题:字符流必须关注编码,优先用 InputStreamReader/OutputStreamWriter 手动指定 UTF-8,避免依赖系统默认编码。
3. 缓冲流的优势:普通流每次读写都直接操作硬件(如硬盘),效率低;缓冲流先将数据读入内存缓冲区,满了再批量操作硬件,大幅减少 IO 次数,是性能优化的关键。
4. 字节流与字符流的选择:读写字节数据(图片、视频)用字节流;读写文本(.txt、日志)用字符流,优先选带缓冲的装饰流。
更多推荐


所有评论(0)