Files.readAllLines()需传入Path和Charset,JDK7+支持并自动处理换行符;trim()仅去首尾空格,压缩全空白用replaceAll;应先读取再处理,避免调试困难;字符集与大文件内存边界是常见故障点。

Files.readAllLines() 读取文件的基本用法
直接调用 Files.readAllLines() 就能拿到 List<string></string>,但必须传入 Path 和字符集(Charset),缺一不可。JDK 7+ 支持,底层自动处理换行符(
、、<code>
),无需手动 trim 或 split。
常见写法:
Path path = Paths.get("data.txt");
List<String> lines = Files.readAllLines(path, StandardCharsets.UTF_8);
- 不传
Charset会用系统默认编码,容易在 Windows/Linux 间出乱码 -
Path不能是String,得用Paths.get()转换 - 文件不存在或无权限时抛
IOException,必须处理(捕获或声明 throws)
为什么读取大文件会 OOM?
Files.readAllLines() 会把整个文件内容一次性加载进内存,每行一个 String 对象,加上 JVM 字符串开销,100MB 文本可能占 300MB+ 堆空间。
- 典型错误现象:
java.lang.OutOfMemoryError: Java heap space - 适用场景仅限小文件(建议 ≤ 1MB,具体看堆大小)
- 若需处理 GB 级日志或 CSV,改用
Files.lines()流式读取 +try-with-resources
中文路径或特殊字符文件名打不开?
Windows 下用 Paths.get("C:用户 est.txt") 会因反斜杠转义失败,报 InvalidPathException;macOS/Linux 中含空格或括号的路径也容易出错。
- 统一用正斜杠:
Paths.get("C:/用户/test.txt") - 或双反斜杠:
Paths.get("C:\用户\test.txt") - 更稳妥的方式:用
FileSystems.getDefault().getPath()构造,它对路径分隔符更宽容
读取后每行末尾有空行或空白符?
Files.readAllLines() 不自动 trim,换行符本身已被剥离,但原文件若存在
(如旧 Mac 文件)或首尾空格,仍会保留在字符串里。
- 如果业务要求干净文本,得手动 map:
lines.stream().map(String::trim).filter(s -> !s.isEmpty()).collect(Collectors.toList()) - 注意
trim()只去首尾空白,不去中间多余空格;若要压缩所有空白,用s.replaceAll("\s+", " ").trim() - 别在读取时就做 heavy transform——先读完再处理,避免流中断或异常时难以调试
readAllLines() 就容易变成故障点。

















