pasos para enviar descomprimir con comprimir comprimido comprime como carpetas archivos archivo java zip java-io

para - ¿Cómo puedo comprimir archivos en Java y no incluir rutas de archivos?



comprimir carpetas zip java (7)

Aquí:

// Add ZIP entry to output stream. out.putNextEntry(new ZipEntry(filename));

Estás creando la entrada para ese archivo utilizando la ruta completa. Si solo usas el nombre (sin la ruta) tendrás lo que necesitas:

// Add ZIP entry to output stream. File file = new File(filename); //"Users/you/image.jpg" out.putNextEntry(new ZipEntry(file.getName())); //"image.jpg"

Por ejemplo, quiero comprimir un archivo comprimido en /Users/me/Desktop/image.jpg

Hice este método:

public static Boolean generateZipFile(ArrayList<String> sourcesFilenames, String destinationDir, String zipFilename){ // Create a buffer for reading the files byte[] buf = new byte[1024]; try { // VER SI HAY QUE CREAR EL ROOT PATH boolean result = (new File(destinationDir)).mkdirs(); String zipFullFilename = destinationDir + "/" + zipFilename ; System.out.println(result); // Create the ZIP file ZipOutputStream out = new ZipOutputStream(new FileOutputStream(zipFullFilename)); // Compress the files for (String filename: sourcesFilenames) { FileInputStream in = new FileInputStream(filename); // Add ZIP entry to output stream. out.putNextEntry(new ZipEntry(filename)); // Transfer bytes from the file to the ZIP file int len; while ((len = in.read(buf)) > 0) { out.write(buf, 0, len); } // Complete the entry out.closeEntry(); in.close(); } // Complete the ZIP file out.close(); return true; } catch (IOException e) { return false; } }

Pero cuando extraigo el archivo, los archivos descomprimidos tienen la ruta completa.

No quiero la ruta completa de cada archivo en el zip. Solo quiero el nombre del archivo.

¿Cómo puedo hacer esto?


Es probable que pueda obtener acceso a los archivos de origen mediante el nuevo FileInputStream (nuevo archivo (sourceFilePath, sourceFileName)).


Está encontrando sus datos de origen utilizando la ruta relativa al archivo, y luego configurando la entrada en la misma cosa. En su lugar, debe convertir la fuente en un objeto de archivo y luego usar

putNextEntry (nueva ZipEntry (sourceFile.getName ()))

eso le dará solo la parte final de la ruta (es decir, el nombre real del archivo)


Haz lo que dijo Jason , o si quieres mantener la firma de tu método, hazlo así:

out.putNextEntry(new ZipEntry(new File(filename).getName()));

o, usando FileNameUtils.getName de apache commons / io:

out.putNextEntry(new ZipEntry(FileNameUtils.getName(filename)));


Sin embargo, si comprime dos archivos del mismo nombre pero con rutas diferentes, se encontrará con errores de entrada de archivos duplicados.


// easy way of zip a file

import java.io. *;

import java.util.zip.*; public class ZipCreateExample{ public static void main(String[] args) throws Exception { // input file FileInputStream in = new FileInputStream("F:/ZipCreateExample.txt");; // out put file ZipOutputStream out =new ZipOutputStream(new FileOutputStrea("F:/tmp.zip")); // name of file in zip folder out.putNextEntry(new ZipEntry("zippedfile.txt")); byte[] b = new byte[1024]; int count; // writing files to new zippedtxt file while ((count = in.read(b)) > 0) { System.out.println(); out.write(b, 0, count); } out.close(); in.close(); } }


try { String zipFile = "/locations/data.zip"; String srcFolder = "/locations"; File folder = new File(srcFolder); String[] sourceFiles = folder.list(); //create byte buffer byte[] buffer = new byte[1024]; /* * To create a zip file, use * * ZipOutputStream(OutputStream out) constructor of ZipOutputStream * class. */ //create object of FileOutputStream FileOutputStream fout = new FileOutputStream(zipFile); //create object of ZipOutputStream from FileOutputStream ZipOutputStream zout = new ZipOutputStream(fout); for (int i = 0; i < sourceFiles.length; i++) { if (sourceFiles[i].equalsIgnoreCase("file.jpg") || sourceFiles[i].equalsIgnoreCase("file1.jpg")) { sourceFiles[i] = srcFolder + fs + sourceFiles[i]; System.out.println("Adding " + sourceFiles[i]); //create object of FileInputStream for source file FileInputStream fin = new FileInputStream(sourceFiles[i]); /* * To begin writing ZipEntry in the zip file, use * * void putNextEntry(ZipEntry entry) method of * ZipOutputStream class. * * This method begins writing a new Zip entry to the zip * file and positions the stream to the start of the entry * data. */ zout.putNextEntry(new ZipEntry(sourceFiles[i].substring(sourceFiles[i].lastIndexOf("/") + 1))); /* * After creating entry in the zip file, actually write the * file. */ int length; while ((length = fin.read(buffer)) > 0) { zout.write(buffer, 0, length); } /* * After writing the file to ZipOutputStream, use * * void closeEntry() method of ZipOutputStream class to * close the current entry and position the stream to write * the next entry. */ zout.closeEntry(); //close the InputStream fin.close(); } } //close the ZipOutputStream zout.close(); System.out.println("Zip file has been created!"); } catch (IOException ioe) { System.out.println("IOException :" + ioe); }