filereader是java中基于默认字符集读取文本文件的类,适合小文件或教学演示,但存在编码不可控导致中文乱码的风险;推荐用inputstreamreader+fileinputstream显式指定编码,或搭配bufferedreader提升性能并支持按行读取。

FileReader 是 Java 中用于读取字符文件的便捷类,它继承自 InputStreamReader,底层自动使用平台默认字符集(如 UTF-8 或 GBK)将字节流解码为字符流。适合读取纯文本(如 .txt、.csv、.log),但不推荐处理中文乱码风险高的场景(建议显式指定编码时用 InputStreamReader + FileInputStream)。
基本用法:逐字符读取
最简单的方式是调用 read() 方法,每次读一个字符(返回 int,-1 表示结束):
try (FileReader reader = new FileReader("data.txt")) {
int ch;
while ((ch = reader.read()) != -1) {
System.out.print((char) ch); // 注意强转为 char
}
} catch (IOException e) {
e.printStackTrace();
}
- 每次
read()调用都可能触发磁盘 I/O,效率较低,仅适合小文件或教学演示 - 不要忽略返回值为 -1 的判断,否则会陷入死循环
- 资源必须关闭——强烈建议用 try-with-resources 自动释放
推荐方式:按字符数组批量读取
用 read(char[] cbuf) 一次读多个字符到缓冲区,显著提升性能:
try (FileReader reader = new FileReader("data.txt")) {
char[] buffer = new char[1024];
int len;
while ((len = reader.read(buffer)) != -1) {
System.out.print(new String(buffer, 0, len));
}
} catch (IOException e) {
e.printStackTrace();
}
-
len是本次实际读到的字符数,末尾可能未填满整个数组,务必用new String(buffer, 0, len)截取 - 缓冲区大小一般设为 1024 或 8192,兼顾内存与效率
- 仍依赖系统默认编码,若文件是 UTF-8 但系统是 GBK,中文会乱码
注意编码问题:FileReader 的局限性
FileReader 没有构造方法支持传入 Charset,它始终使用 Charset.defaultCharset()。这意味着:
- Windows 中文系统默认 GBK,读 UTF-8 文件易出现???
- Linux/macOS 默认 UTF-8,读 GBK 文件同样出错
- 跨环境部署时行为不可控
✅ 更可靠的做法是绕过 FileReader,直接组合 FileInputStream + InputStreamReader:
try (InputStreamReader reader = new InputStreamReader(
new FileInputStream("data.txt"), StandardCharsets.UTF_8)) {
char[] buf = new char[1024];
int n;
while ((n = reader.read(buf)) != -1) {
System.out.print(new String(buf, 0, n));
}
}
补充:配合 BufferedReader 提升体验
单独 FileReader 不支持按行读取。加上 BufferedReader 就能用 readLine():
try (BufferedReader reader = new BufferedReader(
new FileReader("data.txt"))) {
String line;
while ((line = reader.readLine()) != null) {
System.out.println(line);
}
}
-
readLine()返回不含换行符的字符串,null 表示文件结束 - 内部自带 8KB 缓冲区,比裸 FileReader 更快
- 同样受默认编码影响 —— 生产环境请优先用
new BufferedReader(new InputStreamReader(..., UTF_8))
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











