【问题标题】:How can i zip files in Java and not include files paths我如何在 Java 中压缩文件而不包含文件路径
【发布时间】: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 中每个文件的完整路径,我只想要文件名。

我怎样才能做到这一点?

【问题讨论】:

    标签: java zip java-io


    【解决方案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】:

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

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2011-04-12
                  • 2022-11-13
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多