Files.lines()需用try-with-resources显式关闭流以防句柄泄漏;路径用Paths.get();拆行优先split()加边界检查;避免collect全加载;必须指定编码防乱码;Stream惰性执行,终端操作才触发处理。

用 Files.lines() 构建文件行处理流,核心是“按需读取 + 函数式链式处理 + 资源自动释放”,不加载整文件、不手动关流、不写冗余中间集合。
必须用 try-with-resources 包裹流
Files.lines() 返回的 Stream 实现了 AutoCloseable,但不会自动关闭——必须显式用 try-with-resources,否则文件句柄泄漏,尤其在高并发或长期运行服务中极易出问题。
- 正确写法:
try (Stream<String> lines = Files.lines(path)) { ... } - 错误写法:直接
Stream<String> lines = Files.lines(path);(没关流) - 路径要用
Paths.get("xxx.txt")或Path.of("xxx.txt"),别传字符串
按分隔符拆行并安全取字段
多数结构化文本(如空格/制表符/逗号分隔)不需要正则,直接 split() + 边界检查更轻量、更可控。
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
- 避免
.collect(Collectors.toList())全部加载进内存 - 用
map(line -> line.split("\s+"))拆分,再用filter(arr -> arr.length >= 3)过滤无效行 - 提取字段时加索引判断,比如
arr.length > 2 ? arr[0] : "",防止 ArrayIndexOutOfBoundsException
指定编码避免乱码
默认用 UTF-8,但若文件是 GBK、ISO-8859-1 等编码,必须显式传 Charset,否则中文变问号或报 MalformedInputException。
立即学习“Java免费学习笔记(深入)”;
Files.lines(path, StandardCharsets.GBK)Files.lines(path, Charset.forName("GBK"))- 生产环境建议统一约定编码,并在配置或文档中标明
终端操作决定执行时机
Stream 是惰性的,filter、map、sorted 这些中间操作只是登记动作,只有遇到 forEach、count、collect 等终端操作才真正触发逐行读取和计算。
- 想统计含 “ERROR” 的行数?用
.filter(line -> line.contains("ERROR")).count() - 想转成对象列表?用
.map(this::parseLine).collect(Collectors.toList())(注意 collect 是终端操作) - 调试时可临时加
.peek(System.out::println)查看中间结果,不影响逻辑

















