java - 如何使用 java.util.jar api 压缩/压缩整个目录结构?

标签 java jar

我使用以下代码尝试将一个目录及其所有子目录和文件打包到一个 jar 文件中。

private void writeFile(JarOutputStream jos, File f) throws IOException {
  byte buffer[] = new byte[BUFFER_SIZE];

  if (f == null || !f.exists())
      return; //

  JarEntry jarAdd = new JarEntry(f.getName());
  jarAdd.setTime(f.lastModified());
  jos.putNextEntry(jarAdd);

  if(f.isDirectory()){
      File[] files = f.listFiles();
      for(int i = 0; i < files.length ; i++){
          writeFile(jos,files[i]);
      }
  }
  else{
      FileInputStream in = new FileInputStream(f);
      while (true) {
        int nRead = in.read(buffer, 0, buffer.length);
        if (nRead <= 0)
          break;
        jos.write(buffer, 0, nRead);
      }
      in.close();
  }
}

但是 FileInputStream 不适用于目录,所以我假设添加 JarEntry 就足够了。

由于我还有另一个问题,我无法判断这个假设是否正确。 这个问题是许多条目都是重复的。

当尝试添加结构时...

activation
/--activation
   /-- somefile.txt

...此代码失败,因为激活被添加到 jar 中两次。 由于这些是彼此嵌套的不同目录,我不明白为什么这在某种程度上不起作用。

似乎使用 file.getName() 添加条目将获得不包含的条目 ID 区分这些文件所在的目录。 但是当我使用

file.getAbsolutePath() 

比如jar结构乱了 像“C_”这样的目录和包含的文件不再可读。

谁能推荐一种将目录结构正确打包到jar文件中的方法?

最佳答案

请注意 JarEntry代表一个目录(文件夹)必须以斜杠(“/”)结尾,以便被这样对待;否则它将被视为普通文件。

JarEntry dir = new JarEntry("activation/");

关于java - 如何使用 java.util.jar api 压缩/压缩整个目录结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8821615/

相关文章:

java - java类函数太多,如何拆分成多个文件

java - 为什么大写在这里没有正确排序?

java - 梯度错误: Could not find property file

Java -cp 目录不工作,文件工作正常

java - 从另一个 jar 中运行一个 jar

java - 在 jar 中加载资源文件

java - 如何通过桌面java应用程序查询google?

java - 具有重复支持的 MySQL INSERT

java - 尝试构建一个java字节码的反编译器,但不知道在什么情况下 "stack map frame"不会碰巧是 "FRAMSAME"

java - ant 和 java 的 Windows 类路径问题