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
即可立即永久解锁本站全部文章
