java中reader和writer的核心作用是作为字符编码桥梁,读时解码、写时编码,需显式指定standardcharsets.utf_8、配对使用、加缓冲流、并用try-with-resources及时释放资源。

Java 中 Reader 和 Writer 的核心作用是让文本读写自动适配字符编码,避免手动处理字节与 Unicode 的转换。它们不是简单“读/写”工具,而是编码桥梁——读时解码、写时编码,关键在编码一致、缓冲得当、资源可控。
编码必须显式指定,别信默认值
FileReader 和 FileWriter 使用系统默认编码(Windows 常为 GBK,Linux/macOS 多为 UTF-8),跨平台极易乱码。例如在 Windows 上用 FileWriter 写入 UTF-8 内容,再在 Linux 上用 FileReader 读取,中文大概率变 ??。
- 推荐统一使用 InputStreamReader + FileInputStream 和 OutputStreamWriter + FileOutputStream,并传入
StandardCharsets.UTF_8 - 避免直接 new FileReader("a.txt") 或 FileWriter("b.txt"),除非你百分百确认所有环境编码一致
- 如果必须用 FileReader/FileWriter,至少通过构造函数指定 Charset(JDK 11+ 支持):
new FileReader("f.txt", StandardCharsets.UTF_8)
读写要配对,方向不可反
Reader 只负责从源中提取字符,Writer 只负责把字符写入目标,两者不能互换,也不可混用。
- FileReader 不能 write,FileWriter 不能 read——编译会报错
- read() 返回 int(0–65535 表示有效字符,-1 表示 EOF),需强转
(char)才能正确显示 - write(int c) 只取参数低 16 位,高位被截断;传
0x10041实际写入的是0x0041(即 'A')
务必加缓冲,别裸用基础流
FileReader/FileWriter 每次读写都触发磁盘 I/O,性能差且易耗资源。BufferedReader 和 BufferedWriter 提供内存缓冲,大幅提升效率。
- 用
BufferedReader包装 Reader,支持readLine()——它自动去掉\n或\r\n,但不识别\u2028等 Unicode 换行符 - 用
BufferedWriter包装 Writer,配合newLine()实现跨平台换行 - 缓冲流本身不处理编码,所以仍需底层 InputStreamReader/OutputStreamWriter 指定 Charset
资源必须及时释放,优先用 try-with-resources
Reader 和 Writer 都实现 AutoCloseable,未关闭会导致文件句柄泄漏,尤其在高并发或长期运行服务中后果严重。
- 单个流:直接在 try() 中声明,如
try (BufferedReader r = new BufferedReader(...)) { ... } - 多个流:可同时声明,自动按逆序关闭,无需手动调用 close()
- 不要依赖 finalize 或等待 GC —— 文件句柄不会被自动回收
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











