题目
使用Java IO读取文本文件内容并输出
信息
- 类型:问答
- 难度:⭐
考点
文件读取,字节流与字符流,资源关闭
快速回答
使用字符流读取文本文件的标准实现:
- 优先选择
BufferedReader包装FileReader提高效率 - 必须使用
try-with-resources确保资源自动关闭 - 逐行读取使用
readLine()方法 - 处理
IOException异常
原理说明
Java IO中读取文本文件需注意:
- 字符流 vs 字节流:文本文件应使用字符流(
Reader),避免字节流(InputStream)直接处理字符导致的编码问题 - 缓冲机制:
BufferedReader通过内存缓冲减少磁盘I/O次数,显著提升读取效率 - 资源释放:未关闭的流会导致资源泄漏,
try-with-resources(Java 7+)自动调用close()
代码示例
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
public class ReadTextFile {
public static void main(String[] args) {
// 使用try-with-resources自动关闭资源
try (BufferedReader reader = new BufferedReader(new FileReader("example.txt"))) {
String line;
// 逐行读取直到返回null
while ((line = reader.readLine()) != null) {
System.out.println(line);
}
} catch (IOException e) {
System.err.println("读取文件失败: " + e.getMessage());
}
}
}最佳实践
- 始终使用
try-with-resources管理资源,避免手动close()遗漏 - 大文件读取优先用
BufferedReader.readLine(),避免一次性加载内存溢出 - 指定文件编码(如
new InputStreamReader(new FileInputStream(file), StandardCharsets.UTF_8))
常见错误
| 错误示例 | 后果 | 修正方案 |
|---|---|---|
FileReader fr = new FileReader(...);(无缓冲) | 频繁磁盘I/O,性能低下 | 用BufferedReader包装 |
reader.close()放在finally块但未判空 | 可能抛NullPointerException | 使用try-with-resources |
用FileInputStream读取文本 | 中文等非ASCII字符乱码 | 改用字符流Reader |
扩展知识
- NIO替代方案:Java 7+可用
Files.readAllLines(Paths.get("file.txt"))快速读取小文件 - 编码问题:
FileReader使用系统默认编码,跨平台推荐显式指定编码(如UTF-8) - 性能对比:
BufferedReader比基础FileReader快5-10倍(实测百万行文件)