Finn antall linjer i en fil ved hjelp av Java

1. Oversikt

I denne veiledningen lærer vi hvordan du finner antall linjer i en fil ved hjelp av Java ved hjelp av standard Java IO APIer, Google Guava og Apache Commons IO bibliotek.

2. NIO2 Filer

Vær oppmerksom på at vi i løpet av denne opplæringen bruker følgende eksempelverdier som inndatafilnavn og totalt antall linjer:

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

Java 7 introduserte mange forbedringer av eksisterende IO-biblioteker og pakket det under NIO2:

La oss starte med Filer og se hvordan vi kan bruke API-en til å telle antall linjer:

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

Eller bare ved å bruke Filer # readAllLines metode:

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

3. NIO FileChannel

La oss nå sjekke FileChannel, et høyt ytende Java NIO-alternativ for å lese antall 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 ()); while (byteBuffer.hasRemaining ()) {byte currentByte = byteBuffer.get (); hvis (currentByte == '\ n') noOfLines ++; }} assertEquals (NO_OF_LINES, noOfLines); }

Selv om FileChannel ble introdusert i JDK 4, løsningen ovenfor fungerer bare med JDK 7 eller høyere.

4. Google Guava Filer

Et alternativt tredjepartsbibliotek vil være Google Guava Filer klasse. Denne klassen kan også brukes til å telle det totale antallet linjer på samme måte som det vi så med Filer # readAllLines.

La oss starte med å legge til guava avhengighet i vår pom.xml:

 com.google.guava guava 28.0-jre 

Og så kan vi bruke readLines å få en Liste av 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

La oss nå se Apache Commons IO FileUtils API, en parallell løsning til Guava.

For å bruke biblioteket må vi ta med commons-io avhengighet i pom.xml:

 commons-io commons-io 2.6 

På det tidspunktet kan vi bruke Apache Commons IO FileUtils # lineIterator, som rydder opp i noen av filhåndteringen for oss:

@Test offentlig ugyldig 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 litt mer ordentlig enn Google Guava-løsningen.

6. BufferedReader

Så hva med old school måter? Hvis vi ikke bruker JDK 7, og vi ikke kan bruke et tredjepartsbibliotek, har vi det BufferedReader:

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

7. LineNumberReader

Eller vi kan bruke LinjenummerLeser, en direkte underklasse av BufferedReader, som bare er litt mindre ordentlig:

@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 hopp over metode for å gå til slutten av filen, og vi legger til 1 til det totale antallet linjer telles siden linjenummereringen begynner på 0.

8. Skanner

Og til slutt, hvis vi allerede bruker Skanner som en del av en større løsning kan det også løse problemet for oss:

@Test offentlig ugyldig når BrukerScanner_thenReturnTotalNumberOfLines () kaster IOException {try (Scanner scanner = new Scanner (new FileReader (INPUT_FILE_NAME))) {int noOfLines = 0; mens (scanner.hasNextLine ()) {scanner.nextLine (); noOfLines ++; } assertEquals (NO_OF_LINES, noOfLines); }}

9. Konklusjon

I denne opplæringen har vi utforsket forskjellige måter å finne antall linjer i en fil ved hjelp av Java. Siden hovedformålet med alle disse API-ene ikke er å telle antall linjer i en fil, anbefales det å velge riktig løsning for vårt behov.

Som alltid er kildekoden for denne opplæringen tilgjengelig på GitHub.


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