2012-01-11 32 views
1

使用下面的代码尝试将包含其所有子目录和文件的目录打包到一个jar文件中。如何将jar/zip整个目录结构与java.util.jar api?

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 

...此代码失败,因为激活被添加到两次的罐子。 由于这些是不同的目录嵌套在对方,我不明白为什么这不应该以某种方式工作。

看来,增加使用file.getName()将获得入门IDS是做目录这些文件之间不 区分条目。 然而,当我使用

file.getAbsolutePath() 

例如, jar结构与 目录(如“C_”)混乱,并且包含的​​文件不再可读。

任何人都可以推荐一种方法来正确打包jar文件中的目录结构吗?

+0

看看我做的课程:http://all-inhonmodman.svn.sourceforge.net/viewvc/all-inhonmodman/ModManager/src/modmanager/utility/ZIP.java?revision=292&content-type=文本%2Fplain它有你需要的所有方法。 – SHiRKiT 2012-01-11 15:17:12

回答

4

请注意,表示目录(文件夹)的JarEntry必须以斜线(“/”)结尾才能被视为等效;否则将被视为纯文件。

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

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

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

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

+0

这两个答案帮助我做出这项工作,但我只能接受一个。所以,谢谢你们两位! – elfwyn 2012-01-11 15:38:17