Een regel lezen op een bepaald regelnummer uit een bestand in Java

1. Overzicht

In dit korte artikel gaan we kijken naar verschillende manieren om een ​​regel op een bepaald regelnummer in een bestand te lezen.

2. Invoerbestand

Laten we beginnen met het maken van een eenvoudig bestand met de naam inputLines.txt die we in al onze voorbeelden zullen gebruiken:

Lijn 1 Lijn 2 Lijn 3 Lijn 4 Lijn 5

3. Met behulp van BufferedReader

Laten we eens kijken naar het bekende BufferedReader class en het voordeel dat het niet het hele bestand in het geheugen opslaat.

We kunnen een bestand regel voor regel lezen en stoppen wanneer we willen:

@Test openbare ongeldig gegevenFile_whenUsingBufferedReader_thenExtractedLineIsCorrect () {probeer (BufferedReader br = Files.newBufferedReader (Paths.get (FILE_PATH))) {voor (int i = 0; i <3; i ++) {br.readLine (); } String extractedLine = br.readLine (); assertEquals ("Line 4", extractedLine); }}

4. Met behulp van Scanner

Een andere vergelijkbare benadering die we kunnen volgen, is het gebruik van een Scanner:

@Test openbare ongeldig gegevenFile_whenUsingScanner_thenExtractedLineIsCorrect () {probeer (Scanner scanner = nieuwe scanner (nieuw bestand (FILE_PATH))) {voor (int i = 0; i <3; i ++) {scanner.nextLine (); } String extractedLine = scanner.nextLine (); assertEquals ("Line 4", extractedLine); }}

Hoewel bij kleine bestanden het verschil tussen BufferedReader en Scanner is misschien niet merkbaar, op grotere bestanden, de Scanner zal langzamer zijn omdat het ook parseert en een kleinere buffergrootte heeft.

5. Met behulp van de File API

5.1. Kleine bestanden

We kunnen gebruiken Files.readAllLines () van de File API om eenvoudig de inhoud van een bestand in het geheugen te lezen en de gewenste regel uit te pakken:

@Test openbare ongeldige gegevenSmallFile_whenUsingFilesAPI_thenExtractedLineIsCorrect () {String extractedLine = Files.readAllLines (Paths.get (FILE_PATH)). Get (4); assertEquals ("Line 5", extractedLine); }

5.2. Grote bestanden

Als we met grote bestanden moeten werken, moeten we de lijnen methode, die een Stroom zodat we het bestand regel voor regel kunnen lezen:

@Test openbare ongeldige gegevenLargeFile_whenUsingFilesAPI_thenExtractedLineIsCorrect () {probeer (Stream lines = Files.lines (Paths.get (FILE_PATH))) {String extractedLine = lines.skip (4) .findFirst (). Get (); assertEquals ("Line 5", extractedLine); }}

6. Apache Commons IO gebruiken

Een andere optie is het gebruik van de FileUtils klasse van de commons-io pakket, dat het hele bestand leest en de regels retourneert als een lijst met Draads:

@Test openbare leegte gegevenFile_whenUsingFileUtils_thenExtractedLineIsCorrect () {ClassLoader classLoader = getClass (). GetClassLoader (); Bestandsbestand = nieuw bestand (classLoader.getResource ("linesInput.txt"). GetFile ()); List lines = FileUtils.readLines (bestand, "UTF-8"); String extractedLine = lines.get (0); assertEquals ("Lijn 1", extractedLine); }

We kunnen ook de IOUtils klasse om hetzelfde resultaat te bereiken, maar deze keer wordt de hele inhoud geretourneerd als een Draad, en we moeten de splitsing zelf doen:

@Test openbare leegte gegevenFile_whenUsingIOUtils_thenExtractedLineIsCorrect () {String fileContent = IOUtils.toString (nieuwe FileInputStream (FILE_PATH), StandardCharsets.UTF_8); String extractedLine = fileContent.split (System.lineSeparator ()) [0]; assertEquals ("Lijn 1", extractedLine); }

7. Conclusie

In dit korte artikel hebben we de meest gebruikelijke manieren besproken om een ​​regel op een bepaald regelnummer uit een bestand te lezen.

Zoals gewoonlijk zijn de voorbeelden beschikbaar op GitHub.