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

Posted

技术标签:

【中文标题】我如何在 Java 中压缩文件而不包含文件路径【英文标题】:How can i zip files in Java and not include files paths 【发布时间】:2011-03-02 09:46:01 【问题描述】:

例如,我想压缩存储在 /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】:

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

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

这将为您提供路径的最后部分(即实际文件名)

【讨论】:

【参考方案3】:

做as Jason said,或者如果你想保留你的方法签名,这样做:

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

或者,使用来自 apache commons/io 的 FileNameUtils.getName:

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

【讨论】:

【参考方案4】:

您可能可以get away 通过 new FileInputStream(new File(sourceFilePath, sourceFileName)) 访问源文件。

【讨论】:

【参考方案5】:
// easy way of zip a file 

导入 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();
    

【讨论】:

【参考方案6】:
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);

【讨论】:

【参考方案7】:

但是,如果您压缩两个同名但路径不同的文件,则会遇到重复的文件输入错误。

【讨论】:

以上是关于我如何在 Java 中压缩文件而不包含文件路径的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Java 在 SFTP 或 FTP 服务器中压缩文件?

在Memorystream中压缩和解压缩

如何在 Ipad 中压缩文件夹

如何在android中压缩和解压缩png图像

如何在Mac中压缩文件

如何在 Objective C 中压缩、解压缩文件(arm64 支持)