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:
- Lectura, escritura, modificación, creación y borrado de ficheros y directorios.
- Comparación entre ficheros.
- Facilidades de búsqueda en directorios.
- 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