Keresse meg a fájlok sorainak számát a Java használatával

1. Áttekintés

Ebben az oktatóanyagban megtanuljuk hogyan lehet megtalálni a fájlok sorainak számát a Java használatával a szokásos Java IO API-k segítségével, Google Guava és a Apache Commons IO könyvtár.

2. NIO2 Fájlok

Vegye figyelembe, hogy ebben az oktatóanyagban a következő mintaértékeket fogjuk használni a bemeneti fájl neveként és a sorok teljes számaként:

statikus végső karakterlánc INPUT_FILE_NAME = "src / main / resources / input.txt"; statikus végső int NO_OF_LINES = 45; 

A Java 7 számos fejlesztést vezetett be a meglévő IO könyvtárakba, és NIO2 alá csomagolta:

Kezdjük azzal Fájlok és megtudhatjuk, hogyan használhatjuk az API-t a sorok számának megszámolásához:

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

Vagy egyszerűen használva Fájlok # readAllLines módszer:

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

3. NIO FileChannel

Most ellenőrizzük FileChannel, nagy teljesítményű Java NIO alternatíva a sorok számának kiolvasására:

@Test public void, amikorUUNNFileChannel_thenReturnTotalNumberOfLines () dobja az IOException {int noOfLines = 1; próbáld meg (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); }

Bár a FileChannel a JDK 4-ben vezették be, a fenti megoldás csak a JDK 7 vagy újabb verzióval működik.

4. Google Guava Fájlok

Alternatív, harmadik féltől származó könyvtár lenne a Google Guava Fájlok osztály. Ezt az osztályt arra is felhasználhatjuk, hogy a vonalak teljes számát hasonló módon számoljuk, mint amivel láttuk Fájlok # readAllLines.

Kezdjük a gujávafa függőség a mi pom.xml:

 com.google.guava guava 28.0-jre 

És akkor használhatjuk readLines hogy a Lista fájl sorok:

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

5. Apache Commons IO FileUtils

Most nézzük meg az Apache Commons IO-t FileUtils API, a Guava párhuzamos megoldása.

A könyvtár használatához be kell építenünk a commons-io függőséget a pom.xml:

 commons-io commons-io 2.6 

Ezen a ponton használhatjuk az Apache Commons IO-kat FileUtils # lineIterator, amely megtisztítja a fájlkezelések egy részét számunkra:

@Test public void whenUsingApacheCommonsIO_thenReturnTotalNumberOfLines () IOException {int noOfLines = 0; LineIterator lineIterator = FileUtils.lineIterator (új fájl (INPUT_FILE_NAME)); while (lineIterator.hasNext ()) {lineIterator.nextLine (); noOfLines ++; } assertEquals (NO_OF_LINES, noOfLines); }

Mint láthatjuk, ez egy kicsit részletesebb, mint a Google Guava megoldás.

6. BufferedReader

És mi van a régi iskola módjaival? Ha nem vagyunk a JDK 7-en és nem használhatunk harmadik fél könyvtárát, akkor van BufferedReader:

@Test public void whenUsingBufferedReader_thenReturnTotalNumberOfLines () dobja az IOException {int noOfLines = 0; try (BufferedReader olvasó = new BufferedReader (új FileReader (INPUT_FILE_NAME))) {while (olvasó.readLine ()! = null) {noOfLines ++; }} assertEquals (NO_OF_LINES, noOfLines); }

7. LineNumberReader

Vagy használhatjuk LineNumberReader, közvetlen alosztálya BufferedReader, ami csak egy kicsit kevésbé bőbeszédű:

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

Itt vagyunk hívja a kihagy módszer hogy menjen a fájl végére, és 1-et adunk a sorok teljes számához számítva, mivel a sorszámozás 0-nál kezdődik.

8. Scanner

És végül, ha már használjuk Scanner egy nagyobb megoldás részeként megoldhatja számunkra is a problémát:

@Test public void whenUsingScanner_thenReturnTotalNumberOfLines () IOException dobja {try (Szkenner szkenner = új Szkenner (új FileReader (INPUT_FILE_NAME)))) {int noOfLines = 0; while (szkenner.hasNextLine ()) {szkenner.nextLine (); noOfLines ++; } assertEquals (NO_OF_LINES, noOfLines); }}

9. Következtetés

Ebben az oktatóanyagban különböző módszereket tártunk fel a fájlok sorainak megtalálásához a Java használatával. Mivel ezeknek az API-knak a fő célja nem egy fájl sorainak számbavétele, ajánlott az igényünknek megfelelő megoldás kiválasztása.

Mint mindig, az oktatóanyag forráskódja is elérhető a GitHubon.


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