Crear, leer y comprimir archivos en Java.

Muchas veces tenemos la necesidad de necesitar procesar ficheros, creándolos y añadiendo datos en ellos, y no sabemos bien como hacerlo. El problema es que se puede hacer de una forma muy sencilla, pero en un montón de webs a las que he ido a parar, se complican bastante.... Tengo que decir además, que a la hora de nombrar las cosas, se ponen nombres que sólo entiende quien lo ha hecho y muchas veces ese código se hace "infumable" para alguien que está empezando o que quiere salir del paso rápidamente.

Ficheros

Los ficheros se utilizan para guardar información de forma persistente de los programas java. La información dentro de un fichero se guarda: 

  • Por campos: cada una de las variables miembro.
  • Por registros: son cada uno de los objetos. Existen cuatro operaciones básicas para trabajar con ficheros.
  • Apertura del fichero.
  • Lectura de la información.
  • Escritura sobre el fichero.
  • Cierre del fichero. El trabajo con ficheros se realizan por flujos, que son clases java que nos proporcionan los mecanismos necesario para el intercambio de la información entre objetos.

Tipos de ficheros.

Tenemos dos tipos de ficheros.

  • Ficheros secuenciales: Se caracterizan por manejar información de distinta longitud. En una operación de lectura se lee todo el contenido del fichero de principio a fin, la escritura se puede realizar tanto al principio como al final del fichero.
  • Fichero aleatorios o de registro: Se caracterizan por manejar información que tiene la misma longitud.Las operaciones de lectura/escritura se pueden realizar en cualquier parte del fichero.

Clase FileOutputStream.

 Usado para escribir información en formato byte. Acepta como parámetro un String (puede ser el path absoluto o relativo, o sino un nombre), acepta el parámetro File (el fichero creado anteriormente se pasa como objeto) o el parámetro puede ser String, boolean(path/ nombre del archivo, y el segundo parámetro quiere decir que en caso de que exista se añade si es true, si es false, se sobre escribe). Sus métodos:

write(byte[], int, int) void close() //Importante cerrar el flujo para que se guarde la información

Clase FileInputStream 

Abrir un flujo de lectura en byte asociado a un fichero. Puede aceptar como parámetro un String (crea un objeto, flujo de lectura en bytes asociado a un fichero) o con un File(crea un objeto que permite la lectura en bytes del fichero que se pasa como objeto file en el argumento). Sus métodos: 

int read(byte[], int, int) //Devuelve el número de byte leídos. void close() //Importante cerrar el flujo de la lectura. 

Clase FileWriter y FileReader 

  • FIleWriter: Se utiliza para crear un flujo que te permite escribir información que va en caracteres a un fichero.
  • FileReader: Se utiliza para crear un flujo que te permite leer información que en caracteres a un fichero. Se asemejan a las clases de FileInputStream y FIleOutputStream, salvo que estos trabajan con bytes y los segundos con caracteres.

BufferedReader y BufferedWriter 

Las podemos encontrar en java.io. Estas clases tienen la misma función que FileReader y FileWriter, leer y escribir en ficheros, pero BufferedReader y BufferedWriter optimizan estas funciones. Voy hacer un pequeño ejemplo de crear directorios, archivos, escribir y comprimir.

Crear una carpeta

 

File carpetaCreada = new File("//home//maite//pruebados"); if(!carpetaCreada.exists()) { 
carpetaCreada.mkdirs();
System.out.println("Carpeta creada"); 
} 

Crear un archivo dentro de esa carpeta

 

String nombreDelDocumento = "misdatos.txt"
File documentoNuevo = new File("//home//maite//pruebados", nombreDelDocumento); if(!documentoNuevo.exists()) { 
documentoNuevo.createNewFile(); 
System.out.println("Archivo creado"); 
}

Añadir texto al archivo creado.

 

String textoParaAgregar = "Este es el texto inicial que quiero agregar, puede venir también en forma de parámetro"
FileOutputStream escribo = new FileOutputStream(documentoNuevo); escribo.write(textoParaAgregar.getBytes(), 0, textoParaAgregar.length()); escribo.close();

Si queremos agregar texto sin machacar el existente, y que aparezca concatenado.

 

FileWriter documentoAlQueQuieroAgregarTexto = new FileWriter(documentoNuevo, true);
BufferedWriter bw = new BufferedWriter(documentoAlQueQuieroAgregarTexto);
PrintWriter wr = new PrintWriter(bw);
wr.append("\n"+"vamos a añadir algo coherente" ); //concatenamos en el archivo sin borrar lo existente 
System.out.println("Texto agregado.");
wr.close();
bw.close();

En este caso FileWriter documentoAlQueQuieroAgregarTexto = new FileWriter(documentoNuevo, true) vemos que en segundo parámetro es un booleano, con valor true, quiere decir que se añadirá texto a lo que ya existe. Si el valor es false, se sobre-escribirá.

Vamos a leer el contenido del archivo

FileInputStream leer = new FileInputStream(documentoNuevo);
int imprime = leer.read();
while(imprime !=-1) {
    System.out.print((char)imprime);
    imprime = leer.read();
} 

Crear un archivo zip con el documento en el interior y eliminarlo del directorio.

byte[] buffer = new byte[1024];
FileOutputStream rutaArchivoZip = new FileOutputStream(carpetaCreada+"//archivo_zip.zip"); ZipOutputStream crearZip = new ZipOutputStream(rutaArchivoZip);
ZipEntry entradaZip = new ZipEntry(nombreDelDocumento);
crearZip.putNextEntry(entradaZip);
FileInputStream dentro = new FileInputStream(carpetaCreada+"//"+nombreDelDocumento);
int len;
while ((len = dentro.read(buffer)) > 0) {
    crearZip.write(buffer, 0, len); 
}
dentro.close();
crearZip.closeEntry();
crearZip.close();
System.out.println("Hecho");
if(documentoNuevo.delete()){
    System.out.println("Fichero borrado");
}else{
    System.out.println("El fichero no puede ser borrado");
}

Podéis leer un poquito más sobre ello en Java File IO FileInputStream and FileOutputStream Examples