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

iconscandatosUn 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.

Recuerdan que les había comentado…

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.

Pues he actualizado el código de la clase Java utilizado para realizar el scan de un directorio y contar las lineas de los archivos de texto.

Nuevo Código:

/**
 * Clase para realizar el scan de un directorio
 * y contar las lineas de los archivos .txt, .TXT, .log o .LOG contenidos en este
 */


import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.logging.Logger;

/**
 * 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}";
	private static final String DATOS_DIR = "C:\\Users\\alexander\\Downloads\\icons";
	
	/** Logger */
	private static Logger logger = Logger.getLogger(ScanDatos.class.getName());

	/**
	 * Constructor
	 */
	public ScanDatos() {
	}

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		
		logger.info("Ejecutando ScanDatos sobre el directorio [" + DATOS_DIR + "]\n");
		
		File dir = new File(DATOS_DIR);
		String[] ficheros = dir.list();
		long totalReg = 0;
		long ignoreFiles = 0;
		if (ficheros == null) {
			logger.info("No se encontro el directorio [" + DATOS_DIR + "], o no hay archivos en el");
		} else {
			logger.info("Hay " + ficheros.length + " archivos en el directorio [" + DATOS_DIR + "] \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")) { 					logger.info("El archivo [" + nameFile); 					long linesFile = contarLineas(nameFile); 					if (linesFile > 0) {
						totalReg = totalReg + linesFile;
						System.out.println("] tiene " + linesFile + " lineas");
						logger.info("] tiene " + linesFile + " lineas");
					} else {
						System.out.println("] esta vacio.");
						logger.info("] esta vacio.");
					}
				} else {
					ignoreFiles++;
				}
			}
			if (totalReg > 0) {
				logger.info("Se procesaron " + totalReg + " registros en total.\n");
			} else {
				logger.info("No se procesaron registros.\n");
			}
			if (ignoreFiles > 0) {
				logger.info("Se ignoraron " + ignoreFiles + " archivos del directorio [" + DATOS_DIR + "].");
			}
		}
	}

	/**
	 * 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) {
			printLog(e);
		} catch (IOException e) {
			printLog(e);
		} finally {
			try {
				if (br != null) { br.close(); }
				if (fr != null) { fr.close(); }
			} catch (IOException e) {
				printLog(e);
			}
		}
		return lNumeroLineas;
	}
	
	/** Print log */
	private static void printLog(Exception e) {
		logger.severe(e.getClass().getTypeName());
		logger.severe(e.getMessage());
		logger.severe(e.getCause().getMessage());
	}
	
}

Les dejo el Código Original:

/**
 * 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;
 }
 }

Finalmente, les dejo la liga para ver el código en GitHub:

GitHub_Logo

https://github.com/sphera5/ScanDatos

Y ahora también en Sourceforge:

Source Forge Logo

https://sourceforge.net/projects/scandatos/

 

Espero te haya sido útil este post.

………….

Quiero man.tener.me informado: Seguir en Twitter @eldavid_oficial https://twitter.com/eldavid_oficial

Regálame un ME GUSTA. Y si eres solidario, COMPARTE para que otros puedan aprovecharlo.

 

Deja una respuesta

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. Salir /  Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Salir /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Salir /  Cambiar )

Conectando a %s

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.