Pomoću Jave pronađite broj linija u datoteci

1. Pregled

U ovom uputstvu ćemo naučiti kako pronaći broj redaka u datoteci pomoću Jave uz pomoć standardnih Java IO API-ja, Google Guava i Apache Commons IO knjižnica.

2. NIO2 Datoteke

Imajte na umu da ćemo u ovom uputstvu koristiti sljedeće uzorke vrijednosti kao naziv ulazne datoteke i ukupan broj redaka:

statički završni niz INPUT_FILE_NAME = "src / main / resources / input.txt"; statički konačni int NO_OF_LINES = 45; 

Java 7 uvela je mnoga poboljšanja u postojeće IO knjižnice i spakirala ih pod NIO2:

Krenimo od Datoteke i vidjeti kako možemo koristiti njegov API za brojanje brojeva linija:

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

Ili jednostavnim korištenjem Datoteke # readAllLines metoda:

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

3. NIO FileChannel

Sad provjerimo FileChannel, alternativa Java NIO visokih performansi za očitavanje broja redaka:

@Test public void whenUsingNIOFileChannel_thenReturnTotalNumberOfLines () baca IOException {int noOfLines = 1; probajte (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); }

Iako je FileChannel je predstavljen u JDK 4, gore navedeno rješenje radi samo s JDK 7 ili novijim.

4. Google Guava Datoteke

Alternativna biblioteka treće strane bila bi Google Guava Datoteke razred. Ova se klasa također može koristiti za brojanje ukupnog broja linija na sličan način kao što smo vidjeli Datoteke # readAllLines.

Počnimo s dodavanjem guava ovisnost u našem pom.xml:

 com.google.guava guava 28,0-jre 

A onda možemo koristiti readLines dobiti a Popis redova datoteka:

@Test public void whenUsingGoogleGuava_thenReturnTotalNumberOfLines () baca 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

Sada, da vidimo Apache Commons IO FileUtils API, paralelno rješenje za Guavu.

Da bismo koristili knjižnicu, moramo uključiti zajedničku ovisnost io u pom.xml:

 commons-io commons-io 2.6 

U tom trenutku možemo koristiti Apache Commons IO-ove FileUtils # lineIterator, koji nam čisti neke obrade datoteka:

@Test public void whenUsingApacheCommonsIO_thenReturnTotalNumberOfLines () baca IOException {int noOfLines = 0; LineIterator lineIterator = FileUtils.lineIterator (nova datoteka (INPUT_FILE_NAME)); while (lineIterator.hasNext ()) {lineIterator.nextLine (); noOfLines ++; } assertEquals (NO_OF_LINES, noOfLines); }

Kao što vidimo, ovo je malo opširnije od rješenja Google Guava.

6. BufferedReader

Pa, što je s načinima stare škole? Ako nismo na JDK 7 i ne možemo koristiti biblioteku treće strane, imamo BufferedReader:

@Test public void whenUsingBufferedReader_thenReturnTotalNumberOfLines () baca IOException {int noOfLines = 0; probajte (BufferedReader čitač = novi BufferedReader (novi FileReader (INPUT_FILE_NAME)))) {while (reader.readLine ()! = null) {noOfLines ++; }} assertEquals (NO_OF_LINES, noOfLines); }

7. LineNumberReader

Ili, možemo koristiti LineNumberReader, izravna potklasa od BufferedReader, što je malo manje opširno:

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

Evo nas pozivajući preskočiti metoda za prelazak na kraj datoteke i dodajemo 1 ukupnom broju redaka broji se jer numeriranje reda počinje na 0.

8. Skener

I konačno, ako već koristimo Skener kao dio većeg rješenja, i nama može riješiti problem:

@Test public void whenUsingScanner_thenReturnTotalNumberOfLines () baca 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. Zaključak

U ovom uputstvu istražili smo različite načine kako pronaći broj redaka u datoteci pomoću Jave. Budući da glavna svrha svih ovih API-ja nije brojanje broja redaka u datoteci, preporučuje se odabir pravog rješenja za naše potrebe.

Kao i uvijek, izvorni kod za ovu lekciju dostupan je na GitHubu.