Java IO流文件操作

一、IO流的两大体系

· 字节流:以字节为单位,适合处理图像、视频、音频等二进制文件。基类是 InputStream(读)和 OutputStream(写)。

· 字符流:以字符为单位,专门处理文本文件,能避免中文乱码。基类是 Reader(读)和 Writer(写)。

二、文件读写核心操作

  1. 用字节流读写(FileInputStream / FileOutputStream)

· 读文件:创建 FileInputStream,然后用 read() 方法读取。推荐用缓冲区(如 byte1024)一次读一批。

· 写文件:创建 FileOutputStream,调用 write(byte\[\]) 写入。第二个参数设为 true 表示追加内容。

· 注意:完成后必须在 finally 块中关闭流,或使用 try-with-resources 自动关闭。

  1. 用字符流读写(FileReader / FileWriter)

· FileReader 适合读取系统默认编码的文本文件;指定编码则用 InputStreamReader 包装。

· FileWriter 默认覆盖文件,追加同样需传 true。

· 高效方式:用 BufferedReader 包装,可以按行 readLine() 读取;BufferedWriter 则提供 newLine() 方法换行。

三、性能优化:缓冲流

· 作用:BufferedInputStream/BufferedOutputStream 和 BufferedReader/BufferedWriter 在内存中维护缓冲区,显著减少实际读写硬盘的次数。

· 用法:将节点流对象传入缓冲流的构造方法,读写方式与原来完全一致。

· 刷新:写入完成后调用 flush() 强制将缓冲区数据刷入文件,close() 会隐式调用 flush()。

四、处理文件路径与编码

· 路径:推荐用 File 对象或 Path 接口(NIO)来定位文件。

· 编码:FileReader/FileWriter 使用系统默认编码,跨平台易乱码。建议用 new InputStreamReader(new FileInputStream(file), StandardCharsets.UTF_8) 明确指定编码。

五、常见操作示例流程

  1. 复制文件:组合 FileInputStream + FileOutputStream + 字节缓冲区。

  2. 读取文本到内存:BufferedReader 逐行读取,存入 StringBuilder。

  3. 写入文本:BufferedWriter 写入内容。

  4. 追加内容:构造 FileWriter 时第二个参数传 true。

  5. 遍历目录:使用 File.listFiles() 递归遍历。

六、重要注意事项

· 关闭资源:始终在 finally 或 try-with-resources 中关闭流,否则可能导致文件句柄泄漏。

· 异常处理:IO 操作必须捕获或声明 IOException。

· 不要用 read() 单字节循环:极慢,必须用缓冲区批量读写。

· 字符流不要操作二进制文件:会导致文件损坏。

· 随机访问:需要跳转读写时使用 RandomAccessFile。

· NIO 替代:对于高并发或大文件,考虑 FileChannel 或 Files 工具类(如 Files.copy),性能更好。

相关推荐
IT枫斗者枫哥5 分钟前
CompletableFuture失败后返回空列表:异常没了,业务含义也变了
java·后端
知识搬运临时工16 分钟前
一个模板把 AEM 拖进 Full GC 死亡螺旋:300% CPU、7 GB 堆、310 万行堆栈
java·aws
熊猫钓鱼>_>18 分钟前
鸿蒙 PC 三方库适配复盘:libfvad 1.0 —— 把 WebRTC VAD 做成能装进采集链路的静态库
服务器·开发语言·华为·harmonyos·openharmony·适配·鸿蒙pc
用户4329359280519 分钟前
CoAP还是MQTT:1万只Cat.1水表三个月带宽续航实测
java
知守观30 分钟前
多模块架构演进:横向分层 vs 纵向领域,13 个真实项目的切分对照
java·后端·微服务
Ai-_Man31 分钟前
Coze扣子还是不可以导出左侧所有对话,只能点进去单条内容导出,方法不对吗?
开发语言·人工智能·ai·小程序·1024程序员节
raindayinrain39 分钟前
c++设计模式
开发语言·c++·设计模式
Java成神之路-1 小时前
Java String 为什么不可变?和 HashMap 到底有什么关系?
java
hiahiahia1231 小时前
Streaming Model Output
开发语言·前端
paopaokaka_luck1 小时前
基于springboot+vue的益暖微光公益服务平台(DeepSeek公益助手、善款信息追溯、志愿服务积分闭环、ECharts运营分析、活动状态自动流转)
java·前端·javascript·spring boot·mysql·架构·echarts