Læsning af en linje på et givet linjenummer fra en fil i Java

1. Oversigt

I denne hurtige artikel vil vi se på forskellige måder at læse en linje på et givet linjenummer inde i en fil.

2. Indtastningsfil

Lad os starte med at oprette en simpel fil med navnet inputLines.txt som vi bruger i alle vores eksempler:

Linie 1 Linie 2 Linie 3 Linie 4 Linje 5

3. Brug BufferedReader

Lad os se på det velkendte BufferedReader klasse og dens fordel ved ikke at gemme hele filen i hukommelsen.

Vi kan læse en fil linje for linje og stoppe, når vi ønsker:

@Test offentlig ugyldighed givenFile_whenUsingBufferedReader_thenExtractedLineIsCorrect () {try (BufferedReader br = Files.newBufferedReader (Paths.get (FILE_PATH))) {for (int i = 0; i <3; i ++) {br.readLine (); } Streng extractedLine = br.readLine (); assertEquals ("Linie 4", extractedLine); }}

4. Brug Scanner

En anden lignende tilgang, vi kan tage, er at bruge en Scanner:

@Test offentlig ugyldighed givenFile_whenUsingScanner_thenExtractedLineIsCorrect () {try (Scanner scanner = new Scanner (new File (FILE_PATH))) {for (int i = 0; i <3; i ++) {scanner.nextLine (); } Streng extractedLine = scanner.nextLine (); assertEquals ("Linie 4", extractedLine); }}

Selvom det er på små filer, er forskellen mellem BufferedReader og Scanner måske ikke bemærkes, på større filer, Scanner vil være langsommere, da den også parser og har en mindre bufferstørrelse.

5. Brug af File API

5.1. Små filer

Vi kan bruge Files.readAllLines () fra File API for let at læse indholdet af en fil i hukommelsen og udtrække den linje, vi ønsker:

@Test offentlig ugyldighed givenSmallFile_whenUsingFilesAPI_thenExtractedLineIsCorrect () {String extractedLine = Files.readAllLines (Paths.get (FILE_PATH)). Get (4); assertEquals ("Linje 5", extractedLine); }

5.2. Store filer

Hvis vi har brug for at arbejde med store filer, skal vi bruge linjer metode, som returnerer en Strøm så vi kan læse filen linje for linje:

@Test offentlig ugyldighed givetLargeFile_whenUsingFilesAPI_thenExtractedLineIsCorrect () {try (Stream linjer = Files.lines (Paths.get (FILE_PATH))) {String extractedLine = lines.skip (4) .findFirst (). Get (); assertEquals ("Linje 5", extractedLine); }}

6. Brug af Apache Commons IO

En anden mulighed er at bruge FileUtils klasse af commons-io pakke, der læser hele filen og returnerer linjerne som en liste over Snors:

@Test offentlig ugyldighed givenFile_whenUsingFileUtils_thenExtractedLineIsCorrect () {ClassLoader classLoader = getClass (). GetClassLoader (); Filfil = ny fil (classLoader.getResource ("linesInput.txt"). GetFile ()); Listelinjer = FileUtils.readLines (fil, "UTF-8"); Streng extractedLine = lines.get (0); assertEquals ("Line 1", extractedLine); }

Vi kan også bruge IOUtils klasse for at opnå det samme resultat, bortset fra denne gang returneres hele indholdet som en Snor, og vi skal selv splitte:

@Test offentlig ugyldighed givenFile_whenUsingIOUtils_thenExtractedLineIsCorrect () {String fileContent = IOUtils.toString (ny FileInputStream (FILE_PATH), StandardCharsets.UTF_8); Streng extractedLine = fileContent.split (System.lineSeparator ()) [0]; assertEquals ("Line 1", extractedLine); }

7. Konklusion

I denne hurtige artikel har vi gennemgået de mest almindelige måder at læse en linje på et givet linjenummer fra en fil.

Som sædvanligt er eksemplerne tilgængelige på GitHub.