Lese en linje på et gitt linjenummer fra en fil i Java

1. Oversikt

I denne raske artikkelen skal vi se på forskjellige måter å lese en linje på et gitt linjenummer i en fil.

2. Inndatafil

La oss starte med å lage en enkel fil med navnet inputLines.txt som vi bruker i alle eksemplene våre:

Linje 1 Linje 2 Linje 3 Linje 4 Linje 5

3. Bruke BufferedReader

La oss se på det velkjente BufferedReader klasse og dens fordel ved ikke å lagre hele filen i minnet.

Vi kan lese en fil linje for linje og stoppe når vi ønsker:

@Test offentlig ugyldig 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 ("Linje 4", extractedLine); }}

4. Bruke Skanner

En annen lignende tilnærming vi kan ta er å bruke a Skanner:

@Test offentlig ugyldig 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 ("Linje 4", extractedLine); }}

Selv om det er på små filer, er forskjellen mellom BufferedReader og Skanner kanskje ikke merkes, på større filer, Skanner vil være tregere siden den også analyserer og har en mindre bufferstørrelse.

5. Bruke File API

5.1. Små filer

Vi kan bruke Files.readAllLines () fra File API for enkelt å lese innholdet i en fil i minnet og trekke ut linjen vi ønsker:

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

5.2. Store filer

Hvis vi trenger å jobbe med store filer, bør vi bruke linjer metode, som returnerer a Strøm slik at vi kan lese filen linje for linje:

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

6. Bruke Apache Commons IO

Et annet alternativ er å bruke FileUtils klasse av commons-io pakke, som leser hele filen og returnerer linjene som en liste over Strings:

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

Vi kan også bruke IOUtils klasse for å oppnå samme resultat, bortsett fra denne gangen, returneres hele innholdet som en String, og vi må gjøre splittelsen selv:

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

7. Konklusjon

I denne raske artikkelen har vi gått gjennom de vanligste måtene å lese en linje på et gitt linjenummer fra en fil.

Som vanlig er eksemplene tilgjengelige på GitHub.


$config[zx-auto] not found$config[zx-overlay] not found