filereader 是基于字符流的文本读取类,自动使用平台默认编码,适合纯文本文件;需用 try-with-resources 关闭,不支持指定编码,应改用 inputstreamreader 或 files.newbufferedreader 解决乱码问题。

Java 中用 FileReader 处理文本,本质是用字符流读取文件内容,自动处理字符编码(默认使用平台默认编码,通常是 UTF-8 或 GBK),避免了字节流手动解码的麻烦。它适合读纯文本(如 .txt、.csv、.java 源码等),不适用于图片、音频等二进制文件。
FileReader 的基本用法
FileReader 是 Reader 的子类,构造时可传入 String 文件路径或 File 对象。它按字符(char)读取,一次读一个或一批。
- 单字符读取:调用
read(),返回int(实际是char的整数值),读到末尾返回-1 - 批量读取:用
read(char[] cbuf)或read(char[] cbuf, int offset, int length),更高效 - 必须显式关闭:否则可能造成资源泄漏;推荐用 try-with-resources 自动关闭
推荐写法:try-with-resources 自动管理资源
这是最安全、简洁的方式,无需手动调用 close():
try (FileReader fr = new FileReader("example.txt")) {
char[] buffer = new char[1024];
int len;
while ((len = fr.read(buffer)) != -1) {
System.out.print(new String(buffer, 0, len));
}
} catch (IOException e) {
e.printStackTrace();
}
说明:
– buffer 存放读到的字符,len 是本次实际读取的字符数
– new String(buffer, 0, len) 避免把缓冲区剩余空位也转成字符串
指定字符编码(避免乱码的关键)
FileReader **不支持直接指定编码**——它的构造器只接受文件路径/对象,内部始终用 Charset.defaultCharset()。如果文件是 UTF-8 编码而系统默认是 GBK,就会乱码。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
解决办法:不用 FileReader,改用更灵活的组合:
-
FileInputStream+InputStreamReader(可传入StandardCharsets.UTF_8) - 示例:
new InputStreamReader(new FileInputStream("utf8.txt"), StandardCharsets.UTF_8) - JDK 11+ 还可直接用
Files.newBufferedReader(Paths.get("file.txt"), StandardCharsets.UTF_8)
常见问题与注意点
– 不能读取中文路径(旧版 JDK):Windows 下若路径含中文且未正确设置控制台编码,可能抛 FileNotFoundException;建议用 File 对象封装路径,或升级 JDK
– 不支持跳过 BOM:UTF-8 文件开头若有 BOM(\uFEFF),会作为普通字符读出;需手动判断并跳过
– 性能考虑:单字符读取效率低,优先用带缓冲的 BufferedReader 包装 FileReader(如 new BufferedReader(new FileReader("x.txt"))),支持按行读(readLine())
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










