Čitanje retka na zadanom broju retka iz datoteke na Javi

1. Pregled

U ovom ćemo kratkom članku pogledati različite načine čitanja retka na zadanom broju retka unutar datoteke.

2. Ulazna datoteka

Počnimo s izradom jednostavne datoteke s imenom inputLines.txt koje ćemo koristiti u svim našim primjerima:

Linija 1 Linija 2 Linija 3 Linija 4 Linija 5

3. Korištenje BufferedReader

Pogledajmo dobro poznato BufferedReader klase i njegova prednost što ne pohranjuje cijelu datoteku u memoriju.

Možemo čitati datoteku redak po redak i zaustaviti se kad želimo:

@Test javna praznina givenFile_whenUsingBufferedReader_thenExtractedLineIsCorrect () {try (BufferedReader br = Files.newBufferedReader (Paths.get (FILE_PATH))) {for (int i = 0; i <3; i ++) {br.readLine (); } Niz extractedLine = br.readLine (); assertEquals ("Line 4", extractedLine); }}

4. Korištenje Skener

Sličan pristup koji možemo zauzeti jest korištenje a Skener:

@Test public void givenFile_whenUsingScanner_thenExtractedLineIsCorrect () {try (Scanner scanner = new Scanner (new File (FILE_PATH))) {for (int i = 0; i <3; i ++) {scanner.nextLine (); } Niz extractedLine = scanner.nextLine (); assertEquals ("Line 4", extractedLine); }}

Iako je riječ o malim datotekama, razlika između BufferedReader i Skener možda neće biti uočljivo na većim datotekama Skener bit će sporiji jer također vrši raščlanjivanje i ima manju veličinu međuspremnika.

5. Korištenje File API-ja

5.1. Mali dosjei

Možemo koristiti Files.readAllLines () iz API-ja datoteke za jednostavno čitanje sadržaja datoteke u memoriju i izdvajanje retka koji želimo:

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

5.2. Veliki dosjei

Ako trebamo raditi s velikim datotekama, trebali bismo koristiti linije metoda koja vraća a Stream kako bismo mogli čitati datoteku redak po redak:

@Test javna praznina givenLargeFile_whenUsingFilesAPI_thenExtractedLineIsCorrect () {try (Stream lines = Files.lines (Paths.get (FILE_PATH))) {String extractedLine = lines.skip (4) .findFirst (). Get (); assertEquals ("Line 5", extractedLine); }}

6. Korištenje Apache Commons IO

Druga mogućnost je korištenje FileUtils klasa zajedničko-io paket, koji čita cijelu datoteku i vraća retke kao popis Nizs:

@Test javna praznina givenFile_whenUsingFileUtils_thenExtractedLineIsCorrect () {ClassLoader classLoader = getClass (). GetClassLoader (); Datoteka datoteke = nova datoteka (classLoader.getResource ("linesInput.txt"). GetFile ()); Redovi popisa = FileUtils.readLines (datoteka, "UTF-8"); Niz extractedLine = lines.get (0); assertEquals ("Linija 1", extractedLine); }

Također možemo koristiti IOUtils razreda kako bi se postigao isti rezultat, osim što se ovaj put cijeli sadržaj vraća kao Niz, a cijepanje moramo obaviti sami:

@Test javna praznina givenFile_whenUsingIOUtils_thenExtractedLineIsCorrect () {String fileContent = IOUtils.toString (new FileInputStream (FILE_PATH), StandardCharsets.UTF_8); Niz extractedLine = fileContent.split (System.lineSeparator ()) [0]; assertEquals ("Linija 1", extractedLine); }

7. Zaključak

U ovom kratkom članku pregledali smo najčešće načine čitanja retka na zadanom broju retka iz datoteke.

Kao i obično, primjeri su dostupni na GitHubu.