Zoek het aantal regels in een bestand met Java

1. Overzicht

In deze tutorial leren we hoe u het aantal regels in een bestand kunt vinden met Java met behulp van standaard Java IO API's, Google Guava en de Apache Commons IO bibliotheek.

2. NIO2 Bestanden

Merk op dat we in deze tutorial de volgende voorbeeldwaarden zullen gebruiken als de naam van het invoerbestand en het totale aantal regels:

statische laatste String INPUT_FILE_NAME = "src / main / resources / input.txt"; statische laatste int NO_OF_LINES = 45; 

Java 7 introduceerde veel verbeteringen aan de bestaande IO-bibliotheken en verpakt het onder NIO2:

Laten we beginnen met Bestanden en kijk hoe we de API kunnen gebruiken om het aantal regels te tellen:

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

Of door simpelweg te gebruiken Bestanden # readAllLines methode:

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

3. NIO FileChannel

Laten we nu eens kijken FileChannel, een krachtig Java NIO-alternatief om het aantal regels te lezen:

@ Test openbare leegte whenUsingNIOFileChannel_thenReturnTotalNumberOfLines () gooit IOException {int noOfLines = 1; probeer (FileChannel-kanaal = 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); }

Hoewel de FileChannel werd geïntroduceerd in JDK 4, de bovenstaande oplossing werkt alleen met JDK 7 of hoger.

4. Google Guava Bestanden

Een alternatieve bibliotheek van derden is Google Guava Bestanden klasse. Deze klasse kan ook worden gebruikt om het totale aantal regels te tellen op een vergelijkbare manier als waarmee we zagen Bestanden # readAllLines.

Laten we beginnen met het toevoegen van de guave afhankelijkheid in onze pom.xml:

 com.google.guava guave 28.0-jre 

En dan kunnen we gebruiken readLines om een Lijst van bestandsregels:

@Test openbare leegte whenUsingGoogleGuava_thenReturnTotalNumberOfLines () gooit 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

Laten we nu eens kijken naar Apache Commons IO FileUtils API, een parallelle oplossing voor Guava.

Om de bibliotheek te gebruiken, moeten we de commons-io-afhankelijkheid opnemen in het pom.xml:

 commons-io commons-io 2.6 

Op dat moment kunnen we Apache Commons IO's gebruiken FileUtils # lineIterator, dat enkele van de bestandsafhandeling voor ons opruimt:

@ Test openbare leegte whenUsingApacheCommonsIO_thenReturnTotalNumberOfLines () gooit IOException {int noOfLines = 0; LineIterator lineIterator = FileUtils.lineIterator (nieuw bestand (INPUT_FILE_NAME)); while (lineIterator.hasNext ()) {lineIterator.nextLine (); noOfLines ++; } assertEquals (NO_OF_LINES, noOfLines); }

Zoals we kunnen zien, is dit een beetje meer uitgebreid dan de Google Guava-oplossing.

6. BufferedReader

Dus, hoe zit het met ouderwetse manieren? Als we JDK 7 niet gebruiken en we kunnen geen bibliotheek van derden gebruiken, hebben we BufferedReader:

@ Test openbare leegte whenUsingBufferedReader_thenReturnTotalNumberOfLines () gooit IOException {int noOfLines = 0; probeer (BufferedReader-lezer = nieuwe BufferedReader (nieuwe FileReader (INPUT_FILE_NAME))) {while (reader.readLine ()! = null) {noOfLines ++; }} assertEquals (NO_OF_LINES, noOfLines); }

7. LineNumberReader

Of we kunnen gebruiken LineNumberReader, een directe subklasse van BufferedReader, wat net iets minder uitgebreid is:

@Test openbare leegte whenUsingLineNumberReader_thenReturnTotalNumberOfLines () gooit IOException {probeer (LineNumberReader reader = nieuwe LineNumberReader (nieuwe FileReader (INPUT_FILE_NAME))) {reader.skip (Integer.MAX_VALUE); int noOfLines = reader.getLineNumber () + 1; assertEquals (NO_OF_LINES, noOfLines); }}

Hier zijn we bellen met de overspringen methode om naar het einde van het bestand te gaan, en we voegen 1 toe aan het totale aantal regels geteld sinds de regelnummering begint bij 0.

8. Scanner

En tot slot, als we al gebruiken Scanner als onderdeel van een grotere oplossing kan het het probleem ook voor ons oplossen:

@Test public void whenUsingScanner_thenReturnTotalNumberOfLines () gooit IOException {try (Scannerscanner = nieuwe scanner (nieuwe FileReader (INPUT_FILE_NAME))) {int noOfLines = 0; while (scanner.hasNextLine ()) {scanner.nextLine (); noOfLines ++; } assertEquals (NO_OF_LINES, noOfLines); }}

9. Conclusie

In deze tutorial hebben we verschillende manieren onderzocht om met Java het aantal regels in een bestand te vinden. Aangezien het hoofddoel van al deze API's niet is om het aantal regels in een bestand te tellen, is het aan te raden om de juiste oplossing voor onze behoeften te kiezen.

Zoals altijd is de broncode voor deze tutorial beschikbaar op GitHub.


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