Encuentre el número de líneas en un archivo usando Java

1. Información general

En este tutorial, aprenderemos cómo encontrar la cantidad de líneas en un archivo usando Java con la ayuda de las API IO de Java estándar, Google Guav a y la biblioteca IO de Apache Commons .

2. Archivos NIO2

Tenga en cuenta que, a lo largo de este tutorial, utilizaremos los siguientes valores de muestra como el nombre del archivo de entrada y el número total de líneas:

static final String INPUT_FILE_NAME = "src/main/resources/input.txt"; static final int NO_OF_LINES = 45; 

Java 7 introdujo muchas mejoras en las bibliotecas IO existentes y las empaquetó bajo NIO2:

Comencemos con Archivos y veamos cómo podemos usar su API para contar el número de líneas:

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

O simplemente usando el método Files # readAllLines :

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

3. Canal de archivos NIO

Ahora revisemos FileChannel, una alternativa Java NIO de alto rendimiento para leer el número de líneas:

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

Aunque FileChannel se introdujo en JDK 4, la solución anterior solo funciona con JDK 7 o superior .

4. Archivos de Google Guava

Una biblioteca alternativa de terceros sería la clase Google Guava Files . Esta clase también se puede usar para contar el número total de líneas de una manera similar a lo que vimos con Archivos # readAllLines .

Comencemos agregando la dependencia de guayaba en nuestro pom.xml :

 com.google.guava guava 28.0-jre 

Y luego podemos usar readLines para obtener una lista de líneas de archivo:

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

Ahora, veamos Apache Commons IO FileUtils API, una solución paralela a Guava.

Para usar la biblioteca, tenemos que incluir la dependencia commons-io en el pom.xml :

 commons-io commons-io 2.6 

En ese punto, podemos usar FileUtils # lineIterator de Apache Commons IO , que limpia algunos de los manejos de archivos para nosotros:

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

Como podemos ver, esto es un poco más detallado que la solución Google Guava.

6. BufferedReader

Entonces, ¿qué pasa con las formas de la vieja escuela? Si no estamos en JDK 7 y no podemos usar una biblioteca de terceros, tenemos BufferedReader :

@Test public void whenUsingBufferedReader_thenReturnTotalNumberOfLines() throws IOException { int noOfLines = 0; try (BufferedReader reader = new BufferedReader(new FileReader(INPUT_FILE_NAME))) { while (reader.readLine() != null) { noOfLines++; } } assertEquals(NO_OF_LINES, noOfLines); }

7. LineNumberReader

O podemos usar LineNumberReader, una subclase directa de BufferedReader , que es un poco menos detallada:

@Test public void whenUsingLineNumberReader_thenReturnTotalNumberOfLines() throws 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); } }

Aquí llamamos al método skip para ir al final del archivo, y estamos agregando 1 al número total de líneas contadas desde que la numeración de líneas comienza en 0.

8. Escáner

Y finalmente, si ya estamos usando Scanner como parte de una solución más grande, también puede resolver el problema para nosotros:

@Test public void whenUsingScanner_thenReturnTotalNumberOfLines() throws 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. Conclusión

En este tutorial, hemos explorado diferentes formas de encontrar la cantidad de líneas en un archivo usando Java. Dado que el objetivo principal de todas estas API no es contar la cantidad de líneas en un archivo, se recomienda elegir la solución adecuada para nuestras necesidades.

Como siempre, el código fuente de este tutorial está disponible en GitHub.