用于压缩文件的 Java api

标签 java android jar zip gzip

我正在使用 java.util.zip 来压缩 java 中的一些文件。我遇到的问题是压缩文件将为所有父目录创建文件夹。例如,如果我有一个文件位于 C:/folder1/folder2/folder3/file.txt

这将创建一个压缩文件,其中包含名为文件夹 1 的文件夹,然后是文件夹 2,依此类推,直到 file.txt。

我正在寻找的结果是一个压缩文件夹,根目录下只有 file.txt 文件,没有任何文件夹。

这是一些示例代码

BufferedInputStream origin = null;
         FileOutputStream dest = new 
           FileOutputStream("c:\\zip\\myfigs.zip");
         ZipOutputStream out = new ZipOutputStream(new 
           BufferedOutputStream(dest));
         //out.setMethod(ZipOutputStream.DEFLATED);
         byte data[] = new byte[BUFFER];
         // get a list of files from current directory
         String files[] = {"C:/folder1/folder2/folder3/file.txt"};

         for (int i=0; i<files.length; i++) {
            System.out.println("Adding: "+files[i]);
            FileInputStream fi = new 
              FileInputStream(files[i]);
            origin = new 
              BufferedInputStream(fi, BUFFER);
            ZipEntry entry = new ZipEntry(files[i]);
            out.putNextEntry(entry);
            int count;
            while((count = origin.read(data, 0, 
              BUFFER)) != -1) {
               out.write(data, 0, count);
            }
            origin.close();
         }
         out.close();
      } catch(Exception e) {
         e.printStackTrace();
      }

最佳答案

替换此行

ZipEntry entry = new ZipEntry(files[i]);

ZipEntry entry = new ZipEntry(files[i].substring(files[i].lastIndexOf("/")+1));

创建 zipEntry 时,需要指定文件名而不是完整路径。

编辑:

一种更简洁的方法(就像 Louis Wasserman 评论的那样)是使用 File 对象并获取文件名。这是在压缩文件之前检查文件是否存在的一种方法。

关于用于压缩文件的 Java api,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9438055/

相关文章:

java - 有没有办法通过 JMX 开关打开或关闭 Spring Scheduler 任务?

java - xml 布局的底部 View 未显示

java - 在选项卡 View 中插入图库时出现 nullpointerException

android - 从 apk 文件生成 Android App Bundle aab

java - Jenkins - 将源代码编译成 jarfile,用作工件

java - 使用不在 Android 中的核心 java 库(例如 javax.*)的最佳方法是什么

java - 接口(interface)中的变量

javascript - phonegap android 控制台日志不工作

java - 我可以使用类路径覆盖正在运行的 jar 中的文件吗?

java - 自定义JodaTime序列化类返回大对象