Comprimir varios archivos a Zip dentro de una misma carpeta Ayuda por favor


25 de Octubre del 2019

Hola tengo un problema con un test que estoy haciendo, estoy queriendo comprimir varios archivos a .zip dentro de una misma carpeta, he logrado comprimir los archivos en un solo archivo zip en una carpeta exterior, pero no me sale del todo este ejemplo de comprimir todos los archivos a zip dentro de una misma carpeta por separados. Si alguien pudiera ayudar sería bueno para continuar con mi aprendizaje sin frustrarme.

 

aquí les dejo el código de lo que he hecho hasta ahora y los errores que me salen son los siguientes, me muestra en consola una cantidad de archivo que hay en la carpeta incorrecta, el número de archivos es menos y solo tengo una carpeta además con otro archivo de texto en su interior, la idea sería que me mostrará el número exacto de archivo que halla dentro de la carpeta y si hay carpeta que también lo muestre el número, no me interesa que muestre lo que halla dentro de las otras carpetas que puedan estar dentro. solo el contenido de la carpeta ruta File input.

El otro error que me salta es una Exception porque al ver que hay una carpeta dentro y no un archivo al parecer sale esta exception. y me muestra nombres de archivos que no existen con .zi .zia . ziap etc.

 

package clases23flujoEntradaSalida;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;

public class ComprimirArchivosDentroDeCarpetaAZip {


public static void main(String[] args) {
// cadena que contiene la ruta donde están los archivos a comprimir
String directorioZip = "src" + File.separator + "clases23flujoEntradaSalida" + File.separator + "test zip" + File.separator;
// ruta completa donde están los archivos a comprimir
File carpetaComprimir = new File(directorioZip);
File[] ficheros = carpetaComprimir.listFiles();
// valida si existe el directorio
if (carpetaComprimir.exists()) {
// lista los archivos que hay dentro del directorio

System.out.println("Número de ficheros encontrados: " + ficheros.length);

// ciclo para recorrer todos los archivos a comprimir
for (int i = 0; i < ficheros.length; i++) {
System.out.println("Nombre del fichero: " + ficheros[i].getName());
String extension="";
for (int j = 0; j < ficheros[i].getName().length(); j++) {
//obtiene la extensión del archivo
if (ficheros[i].getName().charAt(j)=='.') {
extension=ficheros[i].getName().substring(j, (int)ficheros[i].getName().length());
//System.out.println(extension);
}
}
try {
// crea un buffer temporal para ir poniendo los archivos a comprimir
ZipOutputStream zous = new ZipOutputStream(new FileOutputStream(directorioZip + ficheros[i].getName().replace(extension, ".zip")));

//nombre con el que se va guardar el archivo dentro del zip
ZipEntry entrada = new ZipEntry(ficheros[i].getName());
zous.putNextEntry(entrada);

//System.out.println("Nombre del Archivo: " + entrada.getName());
System.out.println("Comprimiendo.....");
//obtiene el archivo para irlo comprimiendo
FileInputStream fis = new FileInputStream(directorioZip+entrada.getName());
int leer;
byte[] buffer = new byte[1024];
while (0 < (leer = fis.read(buffer))) {
zous.write(buffer, 0, leer);
}
fis.close();
zous.closeEntry();
zous.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
System.out.println("Directorio de salida: " + directorioZip);
} else {
System.out.println("No se encontró el directorio..");
}
}
}

 

Número de ficheros encontrados: 6
Nombre del fichero: nueva carpeta
Comprimiendo.....
java.io.FileNotFoundException: src/clases23flujoEntradaSalida/test zip/nueva carpeta (Is a directory)
at java.base/java.io.FileInputStream.open0(Native Method)
at java.base/java.io.FileInputStream.open(FileInputStream.java:220)
at java.base/java.io.FileInputStream.<init>(FileInputStream.java:158)
at java.base/java.io.FileInputStream.<init>(FileInputStream.java:113)
at clases23flujoEntradaSalida.ComprimirArchivosDentroDeCarpetaAZip.main(ComprimirArchivosDentroDeCarpetaAZip.java:48)
Nombre del fichero: .DS_Store
Comprimiendo.....
Nombre del fichero: chevy.jpg
Comprimiendo.....
Nombre del fichero: .zip
Comprimiendo.....
Nombre del fichero: .zipc.zipa.zipr.zipp.zipe.zipt.zipa.zip .zips.zipi.zipn.zip .zipt.zipí.zipt.zipu.zipl.zipo.zip
Comprimiendo.....
Nombre del fichero: .zipn.zipe.zipw.zip .zipo.zipr.zipd.zipn.zipe.zipr.zip
Comprimiendo.....
Directorio de salida: src/clases23flujoEntradaSalida/test zip/