Lesen einer Zeile mit einer bestimmten Zeilennummer aus einer Datei in Java

1. Übersicht

In diesem kurzen Artikel werden verschiedene Möglichkeiten zum Lesen einer Zeile mit einer bestimmten Zeilennummer in einer Datei beschrieben.

2. Eingabedatei

Beginnen wir mit der Erstellung einer einfachen Datei mit dem Namen inputLines.txt , die wir in all unseren Beispielen verwenden werden:

Line 1 Line 2 Line 3 Line 4 Line 5

3. Verwenden von BufferedReader

Schauen wir uns die bekannte BufferedReader- Klasse und ihren Vorteil an, nicht die gesamte Datei im Speicher zu speichern.

Wir können eine Datei Zeile für Zeile lesen und anhalten, wenn wir möchten:

@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 verwenden

Ein anderer ähnlicher Ansatz ist die Verwendung eines Scanners :

@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); } }

Obwohl bei kleinen Dateien der Unterschied zwischen BufferedReader und Scanner möglicherweise nicht erkennbar ist, ist der Scanner bei größeren Dateien langsamer, da er auch analysiert und eine kleinere Puffergröße aufweist.

5. Verwenden der Datei-API

5.1. Kleine Dateien

Wir können Files.readAllLines () aus der Datei-API verwenden, um den Inhalt einer Datei einfach in den Speicher zu lesen und die gewünschte Zeile zu extrahieren:

@Test public void givenSmallFile_whenUsingFilesAPI_thenExtractedLineIsCorrect() { String extractedLine = Files.readAllLines(Paths.get(FILE_PATH)).get(4); assertEquals("Line 5", extractedLine); }

5.2. Große Dateien

Wenn wir mit großen Dateien arbeiten müssen, sollten wir die lines- Methode verwenden, die einen Stream zurückgibt, damit wir die Datei zeilenweise lesen können:

@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. Verwenden von Apache Commons IO

Eine weitere Option ist mit der FileUtils Klasse des commons-io - Pakets, das die gesamte Datei liest und gibt die Zeilen als eine Liste von String s:

@Test public void givenFile_whenUsingFileUtils_thenExtractedLineIsCorrect() { ClassLoader classLoader = getClass().getClassLoader(); File file = new File(classLoader.getResource("linesInput.txt").getFile()); List lines = FileUtils.readLines(file, "UTF-8"); String extractedLine = lines.get(0); assertEquals("Line 1", extractedLine); }

Wir können auch die IOUtils- Klasse verwenden, um das gleiche Ergebnis zu erzielen, außer dass diesmal der gesamte Inhalt als String zurückgegeben wird und wir die Aufteilung selbst vornehmen müssen:

@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. Fazit

In diesem kurzen Artikel haben wir die gängigsten Methoden zum Lesen einer Zeile mit einer bestimmten Zeilennummer aus einer Datei beschrieben.

Wie üblich sind die Beispiele auf GitHub verfügbar.