files decompress java directory zip

decompress - directorios en un archivo zip cuando se usa java.util.zip.ZipOutputStream



java zip decompress (5)

Simplemente ingrese a la fuente de java.util.zip.ZipEntry. Trata un ZipEntry como directorio si su nombre termina con caracteres "/". Simplemente agregue el nombre del directorio con "/".

Consulte este ejemplo para comprimir solo los directorios vacíos, http://bethecoder.com/applications/tutorials/showTutorials.action?tutorialId=Java_ZipUtilities_ZipEmptyDirectory

Buena suerte.

Digamos que tengo un archivo t.txt, un directorio t y otro archivo t / t2.txt. Si utilizo la utilidad de compresión de Linux "zip -r t.zip t.txt t", obtengo un archivo zip con las siguientes entradas en ellos (descomprimir -l t.zip):

Archive: t.zip Length Date Time Name -------- ---- ---- ---- 9 04-11-09 09:11 t.txt 0 04-11-09 09:12 t/ 15 04-11-09 09:12 t/t2.txt -------- ------- 24 3 files

Si trato de replicar ese comportamiento con java.util.zip.ZipOutputStream y creo una entrada zip para el directorio, java arroja una excepción. Puede manejar solo archivos. Puedo crear una entrada en / t2.txt en el archivo zip y agregar el contenido del archivo t2.txt pero no puedo crear el directorio. ¿Porqué es eso?


Programa Java para Zip (las carpetas contienen vacías o completas)

public class ZipUsingJavaUtil { /* * Zip function zip all files and folders */ @Override @SuppressWarnings("finally") public boolean zipFiles(String srcFolder, String destZipFile) { boolean result = false; try { System.out.println("Program Start zipping the given files"); /* * send to the zip procedure */ zipFolder(srcFolder, destZipFile); result = true; System.out.println("Given files are successfully zipped"); } catch (Exception e) { System.out.println("Some Errors happned during the zip process"); } finally { return result; } } /* * zip the folders */ private void zipFolder(String srcFolder, String destZipFile) throws Exception { ZipOutputStream zip = null; FileOutputStream fileWriter = null; /* * create the output stream to zip file result */ fileWriter = new FileOutputStream(destZipFile); zip = new ZipOutputStream(fileWriter); /* * add the folder to the zip */ addFolderToZip("", srcFolder, zip); /* * close the zip objects */ zip.flush(); zip.close(); } /* * recursively add files to the zip files */ private void addFileToZip(String path, String srcFile, ZipOutputStream zip, boolean flag) throws Exception { /* * create the file object for inputs */ File folder = new File(srcFile); /* * if the folder is empty add empty folder to the Zip file */ if (flag == true) { zip.putNextEntry(new ZipEntry(path + "/" + folder.getName() + "/")); } else { /* * if the current name is directory, recursively traverse it * to get the files */ if (folder.isDirectory()) { /* * if folder is not empty */ addFolderToZip(path, srcFile, zip); } else { /* * write the file to the output */ byte[] buf = new byte[1024]; int len; FileInputStream in = new FileInputStream(srcFile); zip.putNextEntry(new ZipEntry(path + "/" + folder.getName())); while ((len = in.read(buf)) > 0) { /* * Write the Result */ zip.write(buf, 0, len); } } } } /* * add folder to the zip file */ private void addFolderToZip(String path, String srcFolder, ZipOutputStream zip) throws Exception { File folder = new File(srcFolder); /* * check the empty folder */ if (folder.list().length == 0) { System.out.println(folder.getName()); addFileToZip(path, srcFolder, zip, true); } else { /* * list the files in the folder */ for (String fileName : folder.list()) { if (path.equals("")) { addFileToZip(folder.getName(), srcFolder + "/" + fileName, zip, false); } else { addFileToZip(path + "/" + folder.getName(), srcFolder + "/" + fileName, zip, false); } } } } }


Como otros dijeron aquí para agregar el directorio vacío, agregue "/" al nombre del directorio. Preste atención NO para agregar File.separator (es igual a "/") que realmente agrega un archivo vacío al zip.

Me tomó un tiempo entender cuál fue mi error, espero poder ahorrar otro tiempo ...


Puede agregar "/" al final del nombre de la carpeta. Simplemente use el siguiente comando:

zip.putNextEntry(new ZipEntry("xml/"));


ZipOutputStream puede manejar directorios vacíos agregando una barra diagonal / después del nombre de la carpeta. Pruebe ( desde )

public class Test { public static void main(String[] args) { try { FileOutputStream f = new FileOutputStream("test.zip"); ZipOutputStream zip = new ZipOutputStream(new BufferedOutputStream(f)); zip.putNextEntry(new ZipEntry("xml/")); zip.putNextEntry(new ZipEntry("xml/xml")); zip.close(); } catch(Exception e) { System.out.println(e.getMessage()); } } }