Apache Jakarta Commons IO

0
19617

Apache Jakarta Commons IO

Introducción

En este tutorial vamos a hacer una presentación de la librería Jakarta Commons IO de Apache.

Esta librería nos proporciona una extensión a la funcionalidad de los paquetes de Entrada/Salida que nos proporciona la plataforma J2SE.

Para obtener una información más extensa puede dirigirse a la web oficial.

Commons IO se compone de varios paquetes que nos proporcionan:

  • Clases de utilidad
  • Endian. (Si has trabajado con sockets entre distintas plataformas estas clases te servirán de gran ayuda)
  • Iteradores de líneas para stream de caracteres.
  • Nuevos InputStream y OutputStream.

Ejemplos

Clases de utilidad

org.apache.commons.io.FileUtils

Esta clase nos proporciona una valiosa funcionalidad para realizar las siguientes tareas:

  1. Lectura, escritura, modificación, creación y borrado de ficheros y directorios.
  2. Comparación entre ficheros.
  3. Facilidades de búsqueda en directorios.
  4. Cálculo de Checksums.

En la siguiente aplicación resalto la funcionalidad que a mi personalmente me ha parecido más útil.

import java.io.*;
import java.util.*;
import org.apache.commons.io.*;
import org.apache.commons.io.filefilter.*;

/**
 * Varios ejemplos sobre la clase @see org.apache.commons.io.FileUtils
 * @author Carlos García. Autentia
 * @see http://www.mobiletest.es 
 */
public class FileUtilsExamples {	
	/**
	 * Punto de inicio del ejemplo
	 */
	public static void main(String[](){
		InputStream   input1  = null;
		InputStream   input2  = null;
		OutputStream output1 = null;
		Reader reader1 = null;
		final File	 testDir   = new File(System.getProperty("java.io.tmpdir"));
		final File	 testDir2  = new File(System.getProperty("java.home"));
		final File	 testFile1 = new File("c:/a.txt");
		final File	 testFile2 = new File("c:/b.txt");
		
		
		try {
			// Averiguamos el tamaño total de un directorio.
			System.out.println("Nº bytes del directorio: " + FileUtils.sizeOfDirectory(testDir2));

			// Imprime un tamaño en un formato más legible para las personas.
			System.out.println( FileUtils.byteCountToDisplaySize(length)); // Por ejemplo: 80 MB
			
			//  Elimina el contenido de un directorio sin eliminar el directorio.
			// FileUtils.cleanDirectory(testDir);
			
			 // Elimina un fichero cuando finalize la máquina virtual que ejecuta la aplicación.
			 // En caso de especificar un directorio, borra todos los ficheros de todos
			 // los subdirectorios, pero sin eliminar los subdirectorios
			 // FileUtils.forceDeleteOnExit(testFile); 
	        
			// Compara la fecha de creación de dos ficheros
			if (FileUtils.isFileNewer(testFile1, testFile2)){
				System.out.println(testFile1.toString() + " es más reciente");
			} else {
				System.out.println(testFile2.toString() + " es más reciente");
			}
	           
			// Leemos el contenido de un fichero de texto con codificación iso-8859-1
			String content = FileUtils.readFileToString(testFile1, "iso-8859-1");
			System.out.println(content);
			
			 // Obtenemos una colección (de objetos File) de todas las imágenes
			 // un directorio y subdirectorios
			String[]   exts	  = new String[] {"jpg", "gif", "png"};
			Collection images = FileUtils.listFiles(testDir2, exts, true);
			System.out.println("Existen " + images.size() + " imágenes");

			// Implementa el comportamiento del comando 'touch' de Unix.
			// a) Si el fichero no existe lo crea con tamaño 0.
			// b) Si el fichero existe actualiza su fecha de modificación a la hora actual
			//  sin modificar su contenido.
			FileUtils.touch(testFile2); 


			 // Escribe una cadena con codificación UTF-8 en un fichero.
			 // Si el fichero no existiese lo crea.
			FileUtils.writeStringToFile(testFile2, "Carlos García Pérez", "utf-8"); 
		} catch (Exception ex){
			System.out.println(ex);
		} finally {
			// Cerramos los Stream de prueba.
			// Nota, podemos olvidándonos de tener que capturar CUALQUIER excepción. 😉
			IOUtils.closeQuietly(input1);
			IOUtils.closeQuietly(input2);
			IOUtils.closeQuietly(output1);
			IOUtils.closeQuietly(reader1);
		}
	}
}

org.apache.commons.io.IOUtils

Esta clase nos proporciona una valiosa funcionalidad para leer, escribir y comparar Stream, Readers y Writers.

En la siguiente aplicación resalto la funcionalidad que a mi personalmente me ha parecido más útil.

import java.io.*;
import java.util.*;
import org.apache.commons.io.*;
import org.apache.commons.io.filefilter.*;

/**
 * Varios ejemplos sobre la clase @see org.apache.commons.io.IOUtils
 * @author Carlos García. Autentia
 * @see http://www.mobiletest.es 
 */
public class IOUtilsExamples {
	
	/**
	 * Ficheros con los que realizamos las pruebas.
	 */
	private static String TestFile1 = "c:/a.txt"; 
	private static String TestFile2 = "c:/outCommonsIOTest.txt";
	
	/**
	 * Punto de inicio del ejemplo
	 */
	public static void main(String[] args){
		InputStream    input1   = null;
		InputStream    input2   = null;
		OutputStream output1 = null;
		Reader reader1 = null;
		
		try {
			
			// Copiamos el contenido de un InputStream en un OutputStream
			// (Todos los métodos están sobrecargados para usar Readers y Writers)
			input1  = new FileInputStream(TestFile1);
			output1 = new FileOutputStream(TestFile2);
			IOUtils.copy(input1, output1);
			
			// Cerramos los Stream de la prueba
			IOUtils.closeQuietly(input1);
			IOUtils.closeQuietly(output1);
			


			// Comparamos dos InputStream
			input1  = new FileInputStream(TestFile1);
			input2  = new FileInputStream(TestFile2);
			
			if (IOUtils.contentEquals(input1, input2)){
				System.out.println("Los ficheros son iguales");	
			} else {
				System.out.println("Los ficheros son distintos");
			}
			
			// Cerramos los ficheros de la prueba. No lanza excepciones aunque sean null.
			IOUtils.closeQuietly(input1);
			IOUtils.closeQuietly(input2);
			
			
			 // Convertimos una cadena a un byte[] con codificación de caracteres UTF-8
			String	name  = "Cañón";
			byte[]	bytes = IOUtils.toByteArray(new StringReader(name), "UTF-8");			
			System.out.println(name.getBytes().length);  // => 5
			System.out.println(bytes.length);	 // => 7
			
			 // Leemos un stream de texto a través de un Iterator
			 reader1 = new FileReader(TestFile1);
			 LineIterator fileIte = IOUtils.lineIterator(reader1);
			 try {
				while (fileIte.hasNext()) {
					 String line = fileIte.nextLine();
					 
					 // Realizamos el tratamiento de la línea
					 System.out.println(line);
				}
			 } finally {
				 fileIte.close();
				 IOUtils.closeQuietly(reader1);
			 }
		
			 // Averiguamos el número de líneas de un Stream de texto.
			 reader1 = new FileReader(TestFile1);
			 java.util.List list1 = IOUtils.readLines(reader1);
			 IOUtils.closeQuietly(reader1);
			 System.out.println("El fichero tiene " + list1.size() + " lineas.");

			
			// Leemos un recurso a través de su URL. En este caso una página web
			 try {
				 input1 = new java.net.URL("http://www.google.es").openStream();
				 System.out.println(IOUtils.toString(input1));
			 } finally {
				 IOUtils.closeQuietly(input1);
			 }			 
			 
		} catch (Exception ex){
			System.out.println(ex);
		} finally {
			// Cerramos los Stream de prueba.
			// Nota, podemos olvidándonos de tener que capturar CUALQUIER excepción. 😉
			IOUtils.closeQuietly(input1);
			IOUtils.closeQuietly(input2);
			IOUtils.closeQuietly(output1);
			IOUtils.closeQuietly(reader1);
		}
	} // FIN main
} // FIN class

org.apache.commons.io.FilenameUtils

Esta clase nos proporciona una valiosa funcionalidad para el tratamiendo de rutas de archivos.

En la siguiente aplicación resalto la funcionalidad que a mi personalmente me ha parecido más útil.

import java.io.*;
import java.util.*;
import org.apache.commons.io.*;
import org.apache.commons.io.filefilter.*;

/**
 * Varios ejemplos sobre la clase @see org.apache.commons.io.FilenameUtils
 * @author Carlos García. Autentia
 * @see http://www.mobiletest.es 
 */
public class FilenameUtilsExamples {
	/**
	 * Punto de inicio del ejemplo
	 */
	public static void main(String[] args){
		System.out.println(FilenameUtils.concat("c:/windows", "c:/pepe/a")); // c:\pepe\a
		System.out.println(FilenameUtils.concat("c:/windows", "pepe/a"));    // c:\windows\pepe\a
		System.out.println(FilenameUtils.normalize("c:/windows/.//"));       //  c:\windows\
		System.out.println(FilenameUtils.getBaseName("c:/windows/a.bmp"));   // a
		System.out.println(FilenameUtils.getExtension("c:/windows/a.bmp"));  // bmp
		System.out.println(FilenameUtils.getFullPath("c:/windows/a.bmp"));   // c:/windows/
		System.out.println(FilenameUtils.getPath("c:/windows/a.bmp"));       // windows/
		System.out.println(FilenameUtils.separatorsToSystem("c:/windows/a.bmp"));// c:\windows\a.bmp
		System.out.println(FilenameUtils.wildcardMatch("a.bmp", "*.bmp"));   // true
		System.out.println(FilenameUtils.wildcardMatch("a.bmp", "*.jpg"));   // false
		System.out.println(FilenameUtils.wildcardMatch("a/b/a.bmp", "a/b/*")); // true
		System.out.println(FilenameUtils.wildcardMatch("a.bmp", "*.???"));   // true
		System.out.println(FilenameUtils.wildcardMatch("a.bmp", "*.????"));  // false
	}
}

org.apache.commons.io.filefilters.*

Esta clase nos proporciona una valiosa funcionalidad para realizar búsquedas parametrizadas sobre archivos.

En la siguiente aplicación os muestro como utilizar y combinar filtros. Deseo resaltar que existen muchos filtros predefinidos más.

import java.io.*;
import java.util.*;
import org.apache.commons.io.*;
import org.apache.commons.io.filefilter.*;

/**
 * Varios ejemplos sobre las clases del paquete @see org.apache.commons.io.filefilters
 * @author Carlos García. Autentia
 * @see http://www.mobiletest.es 
 */
public class FileFiltersExamples {
	/**
	 * Punto de inicio del ejemplo
	 */
	public static void main(String[] args){
		File	 testDir	= new File(System.getProperty("java.io.tmpdir"));
		String[] files		= null;
		IOFileFilter filter	= null;
		String[] cads		= null;
		
		//  Mostramos los archivos del directorio que comienzan por 'a' o 'A'
		cads   = new String[] {"a", "A"};
		filter = new PrefixFileFilter(cads);
		files  = testDir.list(filter);
		for (int i = 0, nFiles = files.length; i < nFiles; i++ ) {
		     System.out.println(files[i]);
		}
		 
		 // Combinamos dos filtros para mostramos las imágenes de más de 10Kb.
		 cads	= new String[] {".jpg", ".png", ".gif", ".bmp"};
		 filter = new AndFileFilter(new SizeFileFilter(1024 * 10), new SuffixFileFilter(cads));
		 files  = testDir.list(filter);
		 for (int i = 0, nFiles = files.length; i < nFiles; i++ ) {
		     System.out.println(files[i]);
		 }
	}
}

Conclusiones

Como veis este tutorial no tiene una elevada complejidad ni explica
tecnologías complejas, pero creo que este API es interesante y puede ahorrar
tiempo en el desarrollo de cualquier proyecto.

Bueno, espero que os haya sido de utilidad este tutorial.

En Autentia Real Business Solutions, nos gusta compartir el conocimiento. Aquí teneis un poquito más de nuestra aportación.

Si algún día necesitais ayuda con vuestros proyectos o necesitais formación, podéis encontrarnos en Autentia

Carlos García Pérez. Creador de MobileTest, un complemento educativo para los profesores y sus alumnos.

cgpcosmad@gmail.com

DEJA UNA RESPUESTA

Por favor ingrese su comentario!

He leído y acepto la política de privacidad

Por favor ingrese su nombre aquí

Información básica acerca de la protección de datos

  • Responsable:
  • Finalidad:
  • Legitimación:
  • Destinatarios:
  • Derechos:
  • Más información: Puedes ampliar información acerca de la protección de datos en el siguiente enlace:política de privacidad