2012-01-11 62 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