Java中IO流终极指南
🌟 五大核心流详解
1. 基础字节流(FileInputStream/FileOutputStream)
应用场景
- 图片、视频、音频等二进制文件的读写
- 文件加密/解密
- 任意格式文件的复制
代码示例
1 | // 文件加密复制(字节流 + 简单异或加密) |
常见异常及解决
FileNotFoundException
原因:文件路径错误或文件不存在
解决:检查文件路径,确保文件存在
1 | if (!new File("source.jpg").exists()) { |
IOException
原因:磁盘故障或文件被锁定
解决:捕获异常并重试或提示用户
1 | try { |
2. 高效字符流(FileReader/FileWriter)
应用场景
- 文本文件的读写(如日志、配置文件、CSV文件)
- 文本内容分析(如词频统计)
- 文本格式转换
代码示例
1 | // 读取CSV文件并解析(字符流 + 缓冲) |
常见异常及解决
UnsupportedEncodingException
原因:指定了不支持的字符编码
解决:使用标准字符编码(如UTF-8)
1 | new InputStreamReader(new FileInputStream("data.txt"), StandardCharsets.UTF_8); |
MalformedInputException
原因:文件内容与指定编码不匹配
解决:检查文件编码,或使用
CharsetDecoder
处理
1 | CharsetDecoder decoder = StandardCharsets.UTF_8.newDecoder() |
3. 缓冲装饰流(BufferedInputStream/BufferedReader)
应用场景
- 高频读写操作(如日志记录)
- 大文件处理(如文件分割)
- 性能敏感场景
代码示例
1 | // 使用缓冲流实现文件分割 |
常见异常及解决
BufferOverflowException
原因:缓冲区大小不足
解决:增大缓冲区或分块处理
1 | byte[] buffer = new byte[1024 * 1024]; // 1MB缓冲区 |
性能瓶颈
原因:缓冲区大小设置不合理
解决:根据文件大小调整缓冲区(推荐4KB-8KB)
1 | new BufferedInputStream(fis, 8192); // 8KB缓冲区 |
4. 对象序列化流(ObjectInputStream/ObjectOutputStream)
应用场景
- 对象持久化(如游戏存档)
- 分布式系统通信
- 缓存数据存储
代码示例
1 | // 实现对象的深拷贝 |
常见异常及解决
InvalidClassException
原因:序列化版本不一致
解决:显式声明
serialVersionUID
1 | private static final long serialVersionUID = 1L; |
NotSerializableException
原因:未实现
Serializable
接口解决:确保所有嵌套对象都可序列化
1 | class User implements Serializable { ... } |
5. NIO非阻塞流(FileChannel + Buffer)
应用场景
- 超大型文件处理(如日志分析)
- 高性能网络编程
- 零拷贝文件传输
代码示例
1 | // 使用NIO实现文件快速复制 |
常见异常及解决
NonReadableChannelException
原因:尝试从不可读的通道读取数据
解决:检查通道的打开模式
1 | FileChannel channel = new FileInputStream("file.txt").getChannel(); |
OverlappingFileLockException
原因:文件锁冲突
解决:确保锁的范围不重叠
1 | FileLock lock = channel.lock(0, Long.MAX_VALUE, true); |
📊 流类型决策矩阵
需求特征 | 推荐方案 | 性能指标 | 适用场景 |
---|---|---|---|
处理图片/视频 | 字节流 + 缓冲 | ⚡⚡⚡⚡ | 二进制文件处理 |
文本日志处理 | 字符流 + 指定编码 | ⚡⚡⚡ | 文本文件读写 |
对象持久化 | 对象序列化流 | ⚡⚡ | 对象存储与传输 |
100MB以上大文件 | NIO内存映射 | ⚡⚡⚡⚡⚡ | 高性能文件处理 |
网络数据传输 | 缓冲流 + 对象流 | ⚡⚡⚡ | 网络通信与数据交换 |
🚑 错误诊疗室
病例1:资源泄露风暴
1 | // ❌ 危险代码:可能造成文件句柄泄露 |
💊 治疗方案:
1 | // ✅ 安全方案:自动资源管理 |
病例2:幻影乱码怪
1 | // ❌ 错误示范:使用平台默认编码 |
💊 治疗方案:
1 | // ✅ 标准方案:明确指定编码 |
掌握这些核心流类型及其应用场景,配合错误处理经验,你将能够轻松应对各种IO编程挑战!🚀
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 三木博客!
评论