2011-11-01 92 views
1

我正在尋找一種方式直接到獲取.jar中指定子目錄內的所有文件的列表。如何_directly_從.JAR子目錄中獲取文件列表 - JAVA

這是類似的:How do I list the files inside a JAR file?

但不幸的是上面列出的方法會遍歷所有的文件,在整個的.jar。使用帶有許多文件的.jar時 - 這與我的情況似乎不切實際。必須有一種方法可以直接路徑到.jar中的子目錄並迭代其內容,而不必遍歷jar的所有內容,然後過濾結果以找到您關心的條目。

這大致就是我:

public static ArrayList<String> loadInternalFileListing(MetaDataType type, MetaDataLocation location, String siteId) 
{ 
    ArrayList<String> filenameList = new ArrayList<String>(); 
    URL url = getInternalFile(type, null, location, siteId); 

    JarURLConnection juc = null; 
    JarFile jarFile = null; 

    try 
    { 
    juc = (JarURLConnection) url.openConnection(); 
    jarFile = juc.getJarFile(); 
    Enumeration<JarEntry> entries = jarFile.entries(); 

    for(JarEntry jarEntry = entries.nextElement(); entries.hasMoreElements(); jarEntry = entries.nextElement()) 
    { 
     ...//logic here 
    } 
    } 
    ... //catch, handle exceptions, finally block and other logic 

    return filenameList; 
} 

變量:網址 - >中:jar:文件:/ C:/jboss-4.2.2.GA/server/username/tmp /deploy/tmp8421264930467110704SomeEar.ear-contents/SomeBusiness.jar!/subdir1/subdir2/subdir3/subdir4/

的路徑:/ subdir1/subdir2/subdir3/subdir4 /正是我想要的迭代。

調試顯示juc確實正確創建並指向正確的路徑。 jar文件然後如預期,只是給了我的jar文件路徑,這就是爲什麼我失去了子目錄,爲什麼我開始迭代在根。這一切都有道理。這顯然不是正確的方法。必須有另一種方式!

亂收費JarURLConnection理論上指向我感興趣的正確目錄,沒有顯示任何有用的東西。有JarURLConnection.getInputStream()。調試器表明這最終持有ZipFileInputStream,但我無法訪問它,並進一步看起來像它只是ZipFileInputStreamZipFile - 這使我回到了第一。

回答

1

對不起,沒有別的辦法,至少不用標準的java庫。一個zip文件只包含一個條目列表,沒有「隨機訪問」查找。那裏可能有其他的圖書館爲你解析列表並創建某種分層圖的條目,但無論哪種方式,一些代碼需要迭代所有條目以找到你需要的東西。

+0

發佈後,我認爲這可能是由於zip文件的格式/結構造成的。謝謝。 –

相關問題