Manejo de Archivos en Java
Manejo de Archivos en Java
Archivos
La mayora de los desarrolladores Java no requieren del manejo de archivos en sus
labores diarias, sin embargo es esencial ya que muchas de las operaciones de I/O
(Lectura y Escritura de informacin) que involucran archivos tienen mucho que ver
con el rendimiento de algunas aplicaciones.
Procesos de migracin de aplicaciones, integraciones con sistemas legados, carga
de archivos en aplicaciones web, procesos batch, procesos de facturacin
electrnica, etc. son algunas de las aplicaciones en las que se requiere del manejo
de archivos.
Java dentro de su paquete conocido como NIO provee un conjunto de clases para
trabajar con archivos y procesos de I/O en general.
Con el JDK 7 se incluyen un nuevo conjunto de clases en el paquete NIO2 cuyo
enfoque es hacer ms sencillo desde el punto de vista del desarrollo muchas de las
operaciones de I/O, entre ellas la manipulacin de archivos.
Si bien Java desde su inicio se concibi de manera independiente de la plataforma,
muchas de las operaciones que se realizan con archivos si son dependientes de la
plataforma, operaciones sobre symbolic links o vnculos simblicos existen solo en
plataformas Unix es un ejemplo de esta dependencia.
Durante esta lectura revisaremos las clases necesarias para el manejo de archivos
tanto con la versin inicial de Java NIO y NIO2
2. STREAMS
La habilidad de escribir y leer datos de algn recurso o medio y de utilizarla para
producir una salida es una caracterstica muy comn en las aplicaciones
empresariales. A esta interaccin que tiene un programa con el resto se la conoce
como Input/Output (IO)
Tomando en cuenta que un computador puede conectarse a diferentes tipos de
dispositivos de entrada y salida, se hizo necesario definir una forma de abstraer los
diferentes tipos de informacin que se intercambia entre el computador y los
dispositivos, a este flujo de informacin se le conoce con el nombre de Streams.
Las clases utilizadas para realizar las diferentes operaciones de I/O se encuentran
ubicadas en el paquete java.io.*, que contiene todas las clases Streams que
soportan los algoritmos de escritura - lectura. Estas clases estn dividas en dos
grupos jerrquicos, basados en el tipo de dato y son las siguientes:
Character Streams
Byte Streams
Streams y Byte
Archivos
Serializacin Objetos
Filtrado
Streams
CharArrayReader, CharArrayWriter
ByteArrayInputStream,
ByteArrayOutputStream
StringReader, StringWriter
FileReader, FileWriter
FileInputStream, FileOutputStream
Descripcin
Usados para leer y escribir a
memoria ya sea utilizando
caracteres o bytes como
datos.
Usados para leer de un
archivo o escribir a uno
sobre un sistema de archivos
nativo. (NTFS, EXT3).
ObjectInputStream, ObjectOutputStream Usado para serializar objetos
FilterReader, FilterWriter
Usados para filtrar los datos
FIlterInputStream, FilterOutputStream
de un stream ya sea para
leer o escribir al mismo.
Manejar los diferentes niveles del Path como una estructura lineal tipo Arreglo
utilizando el mtodo getName(int posicin)
System.out.println(relativeFilePath.toAbsolutePath());
Path nomalizedFilePath
=Paths.get("C:/workspace/ejemplos/src/resources/dumy/../archivo1.txt")
.normalize();
Comparacin de Paths
Para esta comparacin basta con utilizar el mtodo equals de la clase Path
4. Files
La clase Files es quiz una de las ms grandes caractersticas en NIO2, ya que
soluciona muchos de los inconvenientes que presentaban cuando se trataba de
manipular archivos.
Operaciones al parecer tan simples como mover un archivo de un directorio a otro,
que con la clase File (de NIO) no se poda realizar sino copiando el archivo origen al
directorio destino y luego eliminando el archivo origen, se reducen a una invocacin
a la clase Files y su mtodo move.
e.printStackTrace();
}
Revisemos ahora la creacin con un Files (NIO2)
En esta se verifica la existencia del directorio previo la creacin del archivo, ntese
que se usa el mtodo getParent de la clase Path para obtener el directorio padre del
archivo.
Path newFile = Paths.get("C:\\ejemplos\\archivo1.txt");
try {
//en primer lugar se verifica la existencia del directorio
//ejemplos caso contrario lo crea
if (Files.notExists(newFile.getParent())) {
Files.createDirectory(newFile.getParent());
}
newFile = Files.createFile(newFile);
} catch (IOException e) {
e.printStackTrace();
}
salida.close();
return archivo;
}
NIO2
Charset charset = Charset.forName("UTF-8");
List<string> lines = new ArrayList<>();
lines.add(System.getProperty("line.separator"));
lines.add("Nueva linea");
lines.add("Agregada al Archivo");
lines.add("usando el mtodo write");
// After each line, this method appends the platforms line separator
(line.separator system property).
newFile = Files.write(newFile, lines, charset,
StandardOpenOption.APPEND);
Ejercicio 3
El mtodo write de la clase Files recibe un parmetro que hace referencia a las
operaciones Estndar que se pueden realizar sobre un archivo, cules son estas
operaciones? Nota. Revisar las constantes de la clase StandardOpenOption
Moviendo un archivo
import static java.nio.file.StandardCopyOption.*;
Files.move(pathArchivoOrigen, directorioDestino, REPLACE_EXISTING);
Copiando un archivo
import static java.nio.file.StandardCopyOption.*;
Eliminando un archivo
try { Files.delete(path); }
catch (NoSuchFileException x) { System.err.format("%s: no such" + "
file or directory%n", path); }
catch (DirectoryNotEmptyException x) { System.err.format("%s not
empty%n", path); }
catch (IOException x) { // File permission problems are caught here.
System.err.println(x); }
5. Directorios
Para el manejo de los contenidos y creacin de directorios (carpetas) NIO2
proporciona un conjunto de mtodos de uso sencillo.
Para la copia y mover directorios se utiliza los mismos mtodos que para mover un
archivo ya que el parmetro es un Path y este puede referirse a un directorio.
Ejercicio 5
Para el filtro de archivos se utilizar un concepto conocido como glob pattern, a que
se refiere y como se usa el glob pattern