Realizar el scan de un directorio y contar las lineas de los archivos de texto contenidos en este, mediante #Java

Un ejercicio clásico de programación que ocasionalmente puede llegar a resultarnos útil es el poder revisar un directorio en el cual se encuentran un número de archivos de textos (por ejemplo un directorio de logs).

En nuestro caso, nos interesaba igualmente conocer el número de lineas contenidas en cada archivo, y porque no, ya metido en ello, el total de líneas de todos los archivos de texto del directorio.

Definitivamente no vamos a entrar en este post en los detalles (más que documentados en otros sitios) acerca de como trabajar con el paquete java.io.

Imagen tomada de: http://ob.tener.me/1qqB4R6

Imagen tomada de: http://ob.tener.me/1qqB4R6

Prefiero ser algo más práctico y compartirles directamente el código de mi clase, la cual considero esta decentemente documentada y resulta suficientemente autodescriptiva así que les será sencilla de leer.

/**
 * Clase para realizar el scan de un directorio 
 * y contar las lineas de los archivos .txt, .TXT 
 * contenidos en este
 */
 package main.java;
 import java.io.BufferedReader;
 import java.io.File;
 import java.io.FileNotFoundException;
 import java.io.FileReader;
 import java.io.IOException;
/**
 * Lee el directorio indicado y obtiene la lista de archivos 
 * luego cuenta las lineas de los archivos .txt o .TXT y 
 * finalmente presenta el total de registros procesados
 *
 * @author david.rengifo
 */
 public class ScanDatos {
 /** El path absoluto donde estan los archivos, 
 * se debe escapar con \\ y no colocar \\ al final 
 */
 private static final String DATOS_DIR = 
         "{AQUI_VA_EL_PATH_DONDE_ESTAN_LOS_ARCHIVOS}";
 /**
 * Constructor
 */
 public ScanDatos() {
 }
 /**
 * @param args
 */
 public static void main(String[] args) {
 File dir = new File(DATOS_DIR);
 String[] ficheros = dir.list();
 long totalReg = 0;
 long ignoreFiles = 0;
 if (ficheros == null)
 System.out.println("No hay ficheros en el directorio especificado");
 else {
 System.out.println("Hay " + ficheros.length
 + " archivos en el directorio Datos\n");
 for (int i = 0; i < ficheros.length; i++) {
 String nameFile = ficheros[i];
 if (nameFile.endsWith("txt") || nameFile.endsWith("TXT")
 || nameFile.endsWith(".log") || nameFile.endsWith(".LOG")) {
 System.out.print("El archivo [" + nameFile);
 long linesFile = contarLineas(nameFile);
 if (linesFile > 0) {
 totalReg = totalReg + linesFile;
 System.out.println("] tiene " + linesFile + " lineas");
 } else {
 System.out.println("] esta vacio.");
 }
 } else {
 ignoreFiles++;
 }
 }
 if (totalReg > 0) {
 System.out.println("\nSe procesaron " + totalReg
 + " registros en total.");
 } else {
 System.out.println("\nNo se procesaron registros.");
 }
 if (ignoreFiles > 0) {
 System.out.println("\nSe ignoraron " + ignoreFiles
 + " archivos del directorio Datos.");
 }
 }
 }
 /**
 * Abre el archivo indicado 
 * y cuenta las lineas que contiene
 * @param string - Nombre del archivo
 * @return long
 */
 private static long contarLineas(String string) {
 File archivo = new File(DATOS_DIR.concat("\\").concat(string));
 FileReader fr = null;
 BufferedReader br = null;
 long lNumeroLineas = 0;
 try {
 fr = new FileReader(archivo);
 br = new BufferedReader(fr);
 while ((br.readLine()) != null) {
 lNumeroLineas++;
 }
 } catch (FileNotFoundException e) {
 System.out.println(e.getCause());
 e.printStackTrace();
 } catch (IOException e) {
 System.out.println(e.getCause());
 e.printStackTrace();
 } finally {
 try {
 if (br != null) {
 br.close();
 }
 if (fr != null) {
 fr.close();
 }
 } catch (IOException e) {
 System.out.println(e.getCause());
 e.printStackTrace();
 }
 }
 return lNumeroLineas;
 }
 }

Obviamente el ejercicio es extensible a otro tipo de archivos de textos, como bien podria ser: .info, .config, .properties o cualquier otro que nos sea de utilidad. Así como mejorable, incorporando algún mecanismo para reemplazar la salida a consola por una salida a un archivo. O incluso el uso de log4J.

Finalmente, les dejo la liga para ver el código en Git: https://github.com/sphera5/ScanDatos

Anuncios

Responder

Por favor, inicia sesión con uno de estos métodos para publicar tu comentario:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s