Vyhľadajte počet riadkov v súbore pomocou jazyka Java

1. Prehľad

V tejto príručke sa dozvieme ako zistiť počet riadkov v súbore pomocou Java pomocou štandardných Java IO API, Google Guava a Apache Commons IO knižnica.

2. NIO2 Súbory

Upozorňujeme, že v rámci tohto tutoriálu budeme ako názov vstupného súboru a celkový počet riadkov používať nasledujúce vzorové hodnoty:

statický konečný reťazec INPUT_FILE_NAME = "src / main / resources / input.txt"; statický konečný int NO_OF_LINES = 45; 

Java 7 predstavila mnoho vylepšení existujúcich IO knižníc a zabalila ich pod NIO2:

Začnime s Súbory a uvidíme, ako môžeme pomocou jeho API spočítať počet riadkov:

@Test public void whenUsingNIOFiles_thenReturnTotalNumberOfLines () vyvolá IOException {try (Stream fileStream = Files.lines (Paths.get (INPUT_FILE_NAME))) {int noOfLines = (int) fileStream.count (); assertEquals (NO_OF_LINES, noOfLines); }}

Alebo jednoduchým použitím Súbory # readAllLines metóda:

@Test public void whenUsingNIOFilesReadAllLines_thenReturnTotalNumberOfLines () vyvolá IOException {List fileStream = Files.readAllLines (Paths.get (INPUT_FILE_NAME)); int noOfLines = fileStream.size (); assertEquals (NO_OF_LINES, noOfLines); }

3. NIO FileChannel

Teraz to skontrolujme FileChannel, vysoko výkonná alternatíva Java NIO na čítanie počtu riadkov:

@ Test public void whenUsingNIOFileChannel_thenReturnTotalNumberOfLines () vyvolá IOException {int noOfLines = 1; try (FileChannel channel = FileChannel.open (Paths.get (INPUT_FILE_NAME), StandardOpenOption.READ)) {ByteBuffer byteBuffer = channel.map (MapMode.READ_ONLY, 0, channel.size ()); while (byteBuffer.hasRemaining ()) {byte currentByte = byteBuffer.get (); if (currentByte == '\ n') noOfLines ++; }} assertEquals (NO_OF_LINES, noOfLines); }

Aj keď FileChannel bol predstavený v JDK 4, vyššie uvedené riešenie funguje iba s JDK 7 alebo novším.

4. Google Guava Súbory

Alternatívnou knižnicou tretej strany by bola Google Guava Súbory trieda. Túto triedu možno tiež použiť na počítanie celkového počtu riadkov podobným spôsobom, ako sme videli Súbory # readAllLines.

Začnime pridaním guava závislosť v našom pom.xml:

 com.google.guava guava 28.0-jre 

A potom môžeme použiť readLines získať a Zoznam z riadkov súborov:

@Test public void whenUsingGoogleGuava_thenReturnTotalNumberOfLines () vyvolá IOException {List lineItems = Files.readLines (Paths.get (INPUT_FILE_NAME) .toFile (), Charset.defaultCharset ()); int noOfLines = lineItems.size (); assertEquals (NO_OF_LINES, noOfLines); }

5. Apache Commons IO FileUtils

Teraz sa pozrime na Apache Commons IO FileUtils API, paralelné riešenie pre Guava.

Aby sme mohli knižnicu používať, musíme do nej zahrnúť závislosť commons-io pom.xml:

 commons-io commons-io 2.6 

V tom okamihu môžeme použiť Apache Commons IO FileUtils # lineIterator, ktorý za nás vyčistí niektoré spôsoby spracovania súborov:

@ Test public void whenUsingApacheCommonsIO_thenReturnTotalNumberOfLines () vyvolá IOException {int noOfLines = 0; LineIterator lineIterator = FileUtils.lineIterator (nový súbor (INPUT_FILE_NAME)); while (lineIterator.hasNext ()) {lineIterator.nextLine (); noOfLines ++; } assertEquals (NO_OF_LINES, noOfLines); }

Ako vidíme, je to o niečo podrobnejšie ako riešenie Google Guava.

6. BufferedReader

A čo staré školy? Ak nie sme na JDK 7 a nemôžeme používať knižnicu tretej strany, máme BufferedReader:

@ Test public void whenUsingBufferedReader_thenReturnTotalNumberOfLines () vyvolá IOException {int noOfLines = 0; try (BufferedReader reader = new BufferedReader (new FileReader (INPUT_FILE_NAME))) {while (reader.readLine ()! = null) {noOfLines ++; }} assertEquals (NO_OF_LINES, noOfLines); }

7. LineNumberReader

Alebo môžeme použiť LineNumberReader, priama podtrieda BufferedReader, čo je o niečo menej podrobné:

@Test public void whenUsingLineNumberReader_thenReturnTotalNumberOfLines () vyvolá IOException {try (LineNumberReader reader = nový LineNumberReader (nový FileReader (INPUT_FILE_NAME)))) {reader.skip (Integer.MAX_VALUE); int noOfLines = reader.getLineNumber () + 1; assertEquals (NO_OF_LINES, noOfLines); }}

Tu sme volá preskočiť metóda prejsť na koniec súboru a k celkovému počtu riadkov pripočítame 1 počíta sa od začiatku číslovania riadkov na 0.

8. Skener

A nakoniec, ak už používame Skener ako súčasť väčšieho riešenia môže vyriešiť problém aj pre nás:

@Test public void whenUsingScanner_thenReturnTotalNumberOfLines () vyvolá IOException {try (Scanner scanner = new Scanner (new FileReader (INPUT_FILE_NAME))) {int noOfLines = 0; while (scanner.hasNextLine ()) {scanner.nextLine (); noOfLines ++; } assertEquals (NO_OF_LINES, noOfLines); }}

9. Záver

V tomto tutoriáli sme preskúmali rôzne spôsoby, ako zistiť počet riadkov v súbore pomocou Javy. Pretože hlavným účelom všetkých týchto rozhraní API nie je spočítanie počtu riadkov v súbore, odporúča sa zvoliť pre našu potrebu správne riešenie.

Ako vždy, zdrojový kód tohto tutoriálu je k dispozícii na GitHub.


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