推荐用arraylist逐行存储,核心是try-with-resources自动关流和readline()判空;小文件可用files.readalllines()但需指定编码;多字段解析可嵌套list;流式处理适合过滤场景。

直接用 ArrayList<string></string> 存每行内容是最常用也最稳妥的方式,关键在读取逻辑和资源管理,不是容器本身有多复杂。
用 ArrayList 逐行存入(推荐入门)
这是最直观的做法:打开文件 → 一行一行读 → 每行 add() 进 ArrayList → 关闭流。核心是别漏掉异常处理和资源释放。
- 优先用
try-with-resources自动关流,避免忘记close() -
BufferedReader.readLine()返回null表示到末尾,别用available() > 0判断 - 每行字符串不带换行符(
或),这是正常行为,不是 bug
示例代码:
try (BufferedReader br = new BufferedReader(new FileReader("data.txt"))) {
List<string> lines = new ArrayList();
String line;
while ((line = br.readLine()) != null) {
lines.add(line);
}
// 后续可直接遍历 lines
}</string>
用 Files.readAllLines() 一键加载(适合小文件)
Java 7+ 提供的快捷方法,一行代码把全部行读进 List<string></string>,但有明确限制:
- 必须显式指定编码,比如
StandardCharsets.UTF_8,否则中文容易乱码 - 文件不能太大(建议 ≤10 MB),否则可能内存溢出(OOM)
- 路径要存在且可读,否则抛
IOException子类,如NoSuchFileException
示例:
Path path = Paths.get("config.ini");
if (Files.exists(path) && Files.isReadable(path)) {
List<string> lines = Files.readAllLines(path, StandardCharsets.UTF_8);
}</string>
按结构拆分后存进嵌套集合(如 CSV 或多字段)
如果每行含多个字段(例如用逗号或制表符分隔),可进一步解析再存,常见做法是:
- 先按行读入
ArrayList<string></string> - 对每一行调用
split(",")或split("\t"),得到字段数组 - 把字段数组转成
List<string></string>,再存进外层List<list>></list> - 注意处理引号包裹、转义逗号等边界情况;复杂场景建议用 OpenCSV 或 Apache Commons CSV
简单示例(无转义):
List<list>> table = new ArrayList();
for (String line : lines) {
String[] fields = line.split(",", -1); // -1 保留末尾空字段
table.add(Arrays.asList(fields));
}</list>
用 Stream API 流式处理(适合过滤/转换场景)
如果读完不全留内存,而是边读边处理(比如只取包含“ERROR”的日志行),用 Files.lines() 更高效:
- 返回的是
Stream<string></string>,天然支持filter、map、collect - 底层是懒加载,不会一次性把整个文件读进内存
- 记得
try-with-resources包裹,否则流不关闭会导致句柄泄漏
示例:
try (Stream<string> stream = Files.lines(Paths.get("log.txt"), StandardCharsets.UTF_8)) {
List<string> errors = stream
.filter(line -> line.contains("ERROR"))
.collect(Collectors.toList());
}</string></string>











