Java中按行读取文本文件最推荐的方式是BufferedReader配合Files.newBufferedReader()(Java 7+),高效、自动处理编码、支持try-with-resources自动关流;小文件可用Files.readAllLines();旧版本需显式指定编码并手动关流。

Java 中按行读取文本文件最常用、推荐的方式是使用 BufferedReader 配合 Files.newBufferedReader()(Java 7+),它高效、简洁、自动处理字符编码,且资源管理清晰。
使用 BufferedReader + Files.newBufferedReader(推荐)
这是现代 Java(JDK 7 及以上)的标准做法,底层基于 NIO.2,支持指定字符集,且可配合 try-with-resources 自动关闭流。
- 默认使用 UTF-8 编码(也可显式指定,如 StandardCharsets.GBK)
- 每调用一次
readLine()返回一行字符串(不含换行符),返回null表示文件结束 - 无需手动处理异常关闭,try-with-resources 保证资源释放
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.List;
public class FileReadExample {
public static void main(String[] args) {
Path path = Paths.get("data.txt");
List<String> lines = new ArrayList<>();
try (var reader = Files.newBufferedReader(path, StandardCharsets.UTF_8)) {
String line;
while ((line = reader.readLine()) != null) {
lines.add(line);
System.out.println(line); // 按行打印
}
} catch (IOException e) {
System.err.println("读取文件失败:" + e.getMessage());
}
}
}
使用 Files.readAllLines()(适合小文件)
如果文件不大,且你希望一次性把所有行加载到内存中(比如做简单分析或测试),可用此方法。它返回 List<String>,代码极简。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 内部已使用 UTF-8 编码(也可传入 Charset 参数)
- 不适用于大文件(会一次性加载全部内容到内存)
- 同样自动关闭资源,无需 try-with-resources
try {
List<String> lines = Files.readAllLines(Paths.get("data.txt"), StandardCharsets.UTF_8);
lines.forEach(System.out::println);
} catch (IOException e) {
e.printStackTrace();
}
兼容老版本 JDK(Java 6 及以下)
若项目受限于旧 JDK,需手动构造 FileReader → BufferedReader 链,并注意指定编码(FileReader 默认使用平台编码,易出乱码)。
立即学习“Java免费学习笔记(深入)”;
- 建议改用
InputStreamReader(new FileInputStream(...), "UTF-8")显式指定编码 - 必须用 try-finally 或 try-with-resources 确保 close()
InputStreamReader isr = null;
BufferedReader reader = null;
try {
isr = new InputStreamReader(new FileInputStream("data.txt"), "UTF-8");
reader = new BufferedReader(isr);
String line;
while ((line = reader.readLine()) != null) {
System.out.println(line);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if (reader != null) try { reader.close(); } catch (IOException ignored) {}
if (isr != null) try { isr.close(); } catch (IOException ignored) {}
}
注意事项与常见问题
实际开发中容易忽略的细节:
- 编码必须明确:中文文件不指定 UTF-8/GBK 容易乱码;推荐始终显式传入 Charset
-
路径要存在且可读:建议先用
Files.exists(path)判断,避免 NoSuchFileException - readLine() 不保留换行符:如需原样保留(含 \r\n),应改用字节流或自定义读取逻辑
- 大文件慎用 readAllLines():内存溢出风险高,优先选逐行处理的 BufferedReader

















