Find antallet af linjer i en fil ved hjælp af Java

1. Oversigt

I denne vejledning lærer vi hvordan man finder antallet af linjer i en fil ved hjælp af Java ved hjælp af standard Java IO API'er, Google Guava og Apache Commons IO bibliotek.

2. NIO2 Filer

Bemærk, at vi på tværs af denne tutorial bruger følgende prøveværdier som inputfilens navn og det samlede antal linjer:

statisk endelig String INPUT_FILE_NAME = "src / main / resources / input.txt"; statisk endelig int NO_OF_LINES = 45; 

Java 7 introducerede mange forbedringer af de eksisterende IO-biblioteker og pakket det under NIO2:

Lad os starte med Filer og se hvordan vi kan bruge dets API til at tælle antallet af linjer:

@Test offentlig ugyldig, nårUsingNIOFiles_thenReturnTotalNumberOfLines () kaster IOException {prøv (Stream fileStream = Files.lines (Paths.get (INPUT_FILE_NAME))) {int noOfLines = (int) fileStream.count (); assertEquals (NO_OF_LINES, noOfLines); }}

Eller ved blot at bruge Filer # readAllLines metode:

@Test offentlig ugyldig, når BrugNIOFilesReadAllLines_thenReturnTotalNumberOfLines () kaster IOException {List fileStream = Files.readAllLines (Paths.get (INPUT_FILE_NAME)); int noOfLines = fileStream.size (); assertEquals (NO_OF_LINES, noOfLines); }

3. NIO FileChannel

Lad os nu kontrollere FileChannel, et højtydende Java NIO-alternativ til at læse antallet af linjer:

@Test offentlig ugyldig, nårUsingNIOFileChannel_thenReturnTotalNumberOfLines () kaster IOException {int noOfLines = 1; prøv (FileChannel channel = FileChannel.open (Paths.get (INPUT_FILE_NAME), StandardOpenOption.READ)) {ByteBuffer byteBuffer = channel.map (MapMode.READ_ONLY, 0, channel.size ()); mens (byteBuffer.hasRemaining ()) {byte currentByte = byteBuffer.get (); hvis (currentByte == '\ n') noOfLines ++; }} assertEquals (NO_OF_LINES, noOfLines); }

Selvom FileChannel blev introduceret i JDK 4, ovenstående løsning fungerer kun med JDK 7 eller højere.

4. Google Guava Filer

Et alternativt tredjepartsbibliotek ville være Google Guava Filer klasse. Denne klasse kan også bruges til at tælle det samlede antal linjer på samme måde som det, vi så med Filer # readAllLines.

Lad os starte med at tilføje guava afhængighed i vores pom.xml:

 com.google.guava guava 28.0-jre 

Og så kan vi bruge readLines at få en Liste af fillinjer:

@Test offentlig ugyldig, nårUsingGoogleGuava_thenReturnTotalNumberOfLines () kaster 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

Lad os nu se Apache Commons IO FileUtils API, en parallel løsning til Guava.

For at bruge biblioteket er vi nødt til at medtage commons-io afhængighed i pom.xml:

 commons-io commons-io 2.6 

På det tidspunkt kan vi bruge Apache Commons IO'er FileUtils # lineIterator, som renser nogle af filhåndteringerne for os:

@Test offentligt ugyldigt nårUsingApacheCommonsIO_thenReturnTotalNumberOfLines () kaster IOException {int noOfLines = 0; LineIterator lineIterator = FileUtils.lineIterator (ny fil (INPUT_FILE_NAME)); mens (lineIterator.hasNext ()) {lineIterator.nextLine (); noOfLines ++; } assertEquals (NO_OF_LINES, noOfLines); }

Som vi kan se, er dette lidt mere detaljeret end Google Guava-løsningen.

6. BufferedReader

Så hvad med old-school måder? Hvis vi ikke er på JDK 7, og vi ikke kan bruge et tredjepartsbibliotek, har vi det BufferedReader:

@Test offentlig ugyldig nårUsingBufferedReader_thenReturnTotalNumberOfLines () kaster IOException {int noOfLines = 0; prøv (BufferedReader-læser = ny BufferedReader (ny FileReader (INPUT_FILE_NAME))) {mens (reader.readLine ()! = null) {noOfLines ++; }} assertEquals (NO_OF_LINES, noOfLines); }

7. LineNumberReader

Eller vi kan bruge LinjenummerLæser, en direkte underklasse af BufferedReader, som bare er lidt mindre detaljeret:

@Test offentlig ugyldig, nårUsingLineNumberReader_thenReturnTotalNumberOfLines () kaster 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); }}

Her er vi ringer til springe metode for at gå til slutningen af ​​filen, og vi tilføjer 1 til det samlede antal linjer talt siden linjenummereringen begynder ved 0.

8. Scanner

Og endelig, hvis vi allerede bruger Scanner som en del af en større løsning kan det også løse problemet for os:

@Test offentlig ugyldig, nårUsingScanner_thenReturnTotalNumberOfLines () kaster IOException {prøv (Scannerscanner = ny scanner (ny FileReader (INPUT_FILE_NAME))) {int noOfLines = 0; mens (scanner.hasNextLine ()) {scanner.nextLine (); noOfLines ++; } assertEquals (NO_OF_LINES, noOfLines); }}

9. Konklusion

I denne vejledning har vi undersøgt forskellige måder at finde antallet af linjer i en fil ved hjælp af Java. Da hovedformålet med alle disse API'er ikke er at tælle antallet af linjer i en fil, anbefales det at vælge den rigtige løsning til vores behov.

Som altid er kildekoden til denne tutorial tilgængelig på GitHub.