如何使用java.util.jar api对整个目录结构进行jar / zip?

时间:2012-01-11 15:12:26

标签: 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文件中的目录结构吗?

2 个答案:

答案 0 :(得分:4)

请注意,表示目录(文件夹)的JarEntry必须以斜杠(“/”)结尾才能被视为这样;否则它将被视为普通文件。

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

答案 1 :(得分:3)

条目的名称应该是树根的相对路径。如果你有

a
-- b
------c.txt

条目应为a/a/b/a/b/c.txt。为您的递归方法(最初为空字符串)添加前缀参数,并且每次满足目录时,使用当前前缀+附加的目录名称+ /调用该方法。并且始终在文件名前加上前缀以组成条目名称。