如何在Java中压缩文件而不包含文件路径

2022-09-02 03:23:17

例如,我想压缩存储在 /Users/me/Desktop/image 中的文件.jpg

我做了这个方法:

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;
  }  
 }

但是当我提取文件时,解压缩的文件具有完整路径。

我不想要zip中每个文件的完整路径,我只想要文件名。

我该怎么做?


答案 1

这里:

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

您正在使用整个路径为该文件创建条目。如果您只使用名称(不带路径),您将拥有所需的内容:

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

答案 2

您正在使用文件的相对路径查找源数据,然后将 Entry 设置为相同的内容。相反,您应该将源转换为 File 对象,然后使用

putNextEntry(new ZipEntry(sourceFile.getName()))

这将只给你路径的最后一部分(即,实际的文件名)


推荐