使用Java从文件中读取指定行号的一行

2025/04/06

1. 概述

在这篇简短的文章中,我们将研究读取文件中给定行号处的行的不同方法。

2. 输入文件

让我们首先创建一个名为inputLines.txt的简单文件,我们将在所有示例中使用它:

Line 1
Line 2
Line 3
Line 4
Line 5

3. BufferedReader

让我们看看众所周知的BufferedReader类及其不将整个文件存储到内存中的优点。

我们可以逐行读取文件并在需要时停止

@Test
public void givenFile_whenUsingBufferedReader_thenExtractedLineIsCorrect() {
    try (BufferedReader br = Files.newBufferedReader(Paths.get(FILE_PATH))) {
        for (int i = 0; i < 3; i++) {
            br.readLine();
        }

        String extractedLine = br.readLine();
        assertEquals("Line 4", extractedLine);
    }
}

4. 使用Scanner

我们可以采用的另一种类似方法是使用Scanner

@Test
public void givenFile_whenUsingScanner_thenExtractedLineIsCorrect() {
    try (Scanner scanner = new Scanner(new File(FILE_PATH))) {
        for (int i = 0; i < 3; i++) {
            scanner.nextLine();
        }

        String extractedLine = scanner.nextLine();
        assertEquals("Line 4", extractedLine);
    }
}

虽然对于小文件来说,BufferedReader和Scanner之间的差异可能不明显,但对于较大的文件来说,Scanner会更慢,因为它也要进行解析并且缓冲区大小更小

5. 使用Files API

5.1 小文件

我们可以使用File API中的Files.readAllLines()轻松地将文件内容读入内存并提取我们想要的行:

@Test
public void givenSmallFile_whenUsingFilesAPI_thenExtractedLineIsCorrect() {
    String extractedLine = Files.readAllLines(Paths.get(FILE_PATH)).get(4);

    assertEquals("Line 5", extractedLine);
}

5.2 大文件

如果我们需要处理大文件,我们应该使用lines方法,它返回一个Stream以便我们可以逐行读取文件

@Test
public void givenLargeFile_whenUsingFilesAPI_thenExtractedLineIsCorrect() {
    try (Stream lines = Files.lines(Paths.get(FILE_PATH))) {
        String extractedLine = lines.skip(4).findFirst().get();

        assertEquals("Line 5", extractedLine);
    }
}

6. 使用Apache Commons IO

另一种选择是使用commons-io包的FileUtils类,它读取整个文件并将行作为String列表返回:

@Test
public void givenFile_whenUsingFileUtils_thenExtractedLineIsCorrect() {
    ClassLoader classLoader = getClass().getClassLoader();
    File file = new File(classLoader.getResource("linesInput.txt").getFile());

    List<String> lines = FileUtils.readLines(file, "UTF-8");

    String extractedLine = lines.get(0);
    assertEquals("Line 1", extractedLine);
}

我们也可以使用IOUtils类来实现相同的结果,只是这次,整个内容作为String返回,我们必须自己进行拆分

@Test
public void givenFile_whenUsingIOUtils_thenExtractedLineIsCorrect() {
    String fileContent = IOUtils.toString(new FileInputStream(FILE_PATH), StandardCharsets.UTF_8);

    String extractedLine = fileContent.split(System.lineSeparator())[0];
    assertEquals("Line 1", extractedLine);
}

7. 总结

在这篇简短的文章中,我们介绍了从文件中读取给定行号处的行的最常见方法。

Show Disqus Comments

Post Directory

扫码关注公众号:Taketoday
发送 290992
即可立即永久解锁本站全部文章