java 8 及以上版本中,使用 java.nio.file.files 类读取文件所有行最便捷的方法是调用 files.readalllines(path)。该方法会一次性将文件内容全部加载到内存中的 list<string></string> 对象里,默认使用 utf-8 编码。如果文件较大,建议改用 files.lines(path) 获取 stream<string></string> 以节省内存。

Files.readAllLines() 返回的数据结构是什么
Files.readAllLines() 方法返回的是一个 java.util.List<string></string> 集合。这意味着你可以像操作普通列表一样对读取到的每一行进行索引访问、遍历或过滤。每一行字符串不包含换行符(如 \n 或 \r\n),因为该方法会自动处理行分隔符。

import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.List;
public class ReadAllLinesDemo {
public static void main(String[] args) throws Exception {
// 指定文件路径
String filePath = "data.txt";
// 调用 readAllLines 读取所有行
List<String> lines = Files.readAllLines(Paths.get(filePath));
// 输出结果
for (int i = 0; i < lines.size(); i++) {
System.out.println("Line " + i + ": " + lines.get(i));
}
}
}
预期结果:控制台打印出文件中每一行的内容,索引从 0 开始,每行文本不含末尾换行符。
立即学习“Java免费学习笔记(深入)”;
Files.lines() 与 readAllLines() 的主要区别
Files.lines(Path) 返回的是 java.util.stream.Stream<string></string>,它采用惰性求值的方式逐行读取文件。这种方式适合处理大文件,因为它不会一次性将所有内容加载到内存中,而是按需生成流元素。需要注意的是,Stream 使用后必须关闭,通常通过 try-with-resources 语句自动管理资源释放。

import java.nio.file.Files;
import java.nio.file.Paths;
import java.io.IOException;
import java.util.stream.Stream;
public class StreamLinesDemo {
public static void main(String[] args) {
String filePath = "data.txt";
// 使用 try-with-resources 确保流被正确关闭
try (Stream<String> stream = Files.lines(Paths.get(filePath))) {
// 过滤包含特定关键字的行并计数
long count = stream.filter(line -> line.contains("error"))
.count();
System.out.println("Found 'error' in " + count + " lines.");
} catch (IOException e) {
e.printStackTrace();
}
}
}
预期结果:程序统计出文件中包含 "error" 字符串的行数,并打印该数字。相比 readAllLines,此方式内存占用更低,但无法直接通过索引访问某一行。
当文件不存在时 Files 类会抛出什么异常
无论是使用 Files.readAllLines() 还是 Files.lines(),如果指定的文件路径不存在,都会抛出 java.nio.file.NoSuchFileException。这是 IOException 的子类,因此在代码中需要捕获 IOException 或其子类来处理文件缺失的情况。此外,如果文件是目录而非普通文件,也会抛出 NotDirectoryException 或其他相关 IO 异常。
import java.nio.file.Files;
import java.nio.file.Paths;
import java.nio.file.NoSuchFileException;
import java.util.List;
public class HandleMissingFile {
public static void main(String[] args) {
String missingPath = "nonexistent.txt";
try {
List<String> lines = Files.readAllLines(Paths.get(missingPath));
} catch (NoSuchFileException e) {
System.out.println("File not found: " + e.getMessage());
} catch (Exception e) {
System.out.println("Other error: " + e.getClass().getName());
}
}
}
预期结果:控制台输出 "File not found: nonexistent.txt",程序正常结束而未崩溃。


















