files.lines()是java 8引入的按行读取文本文件为stream的方法,需用try-with-resources显式关闭以避免资源泄漏,支持编码指定,默认utf-8。

Files.lines() 是 Java 8 引入的便捷方法,能直接将文本文件按行读取为 Stream<string></string>,适合函数式风格处理(如过滤、映射、收集),无需手动管理 BufferedReader 或 try-with-resources(它内部已封装)。但要注意:它返回的是**有资源依赖的 Stream**,必须显式关闭,否则可能引发文件句柄泄漏。
基本用法:读取并打印所有行
最简示例:
try (Stream<string> lines = Files.lines(Paths.get("data.txt"))) {
lines.forEach(System.out::println);
} catch (IOException e) {
e.printStackTrace();
}</string>
关键点:
- 必须用 try-with-resources 包裹,确保底层 BufferedReader 关闭;
- 路径支持
Path对象,常用Paths.get("xxx")构造; - 默认使用 UTF-8 编码,如需指定编码,用重载方法:
Files.lines(path, StandardCharsets.UTF_8)。
常见流式处理操作(过滤、转换、收集)
利用 Stream API 链式调用,例如统计非空行数、提取邮箱、转为 List:
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
try (Stream<string> lines = Files.lines(Paths.get("users.txt"))) {
long count = lines
.filter(line -> !line.trim().isEmpty())
.count();
System.out.println("有效行数:" + count);
} catch (IOException e) {
e.printStackTrace();
}</string>
注意:一旦调用终端操作(如 count()、collect()),Stream 就消费完毕,不能再复用。若需多次处理,应重新获取 Stream 或先收集到集合中。
避免常见陷阱
以下写法是错误或危险的:
- 忘记 try-with-resources → 文件句柄不释放,尤其在循环或高并发场景易出问题;
- 把 Stream 赋值给变量后延迟使用(如存入字段或返回未关闭的 Stream)→ 资源泄露;
- 在 lambda 中抛出受检异常(如 IOException)→ Stream 的 forEach 不支持,需包装成 RuntimeException 或改用传统 try-catch;
- 用错编码导致中文乱码 → 明确传入
StandardCharsets.UTF_8等编码参数。
替代方案对比:什么时候不用 lines?
如果只需一次性读全部内容为字符串或 List,更推荐:
-
Files.readString(path)(Java 11+)→ 读整个文件为 String; -
Files.readAllLines(path)→ 读为List<string></string>,适合小文件且需随机访问; -
Files.lines()更适合大文件、逐行处理、中间有复杂逻辑或需短路操作(如findFirst())的场景。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










