2015-02-17 135 views
1

我有一個名爲「jar1.jar」的jar文件。在裏面,它有另一個名爲「jar2.jar」的jar文件。Java:訪問嵌入式jar文件中的文件

「jar2.jar」的內容是:「file.txt」。

jar1.jar 
| 
|-> jar2.jar 
    | 
    |-> file.txt 

我想獲得「file.txt」的內容。

我的代碼如下所示:

try{ 
    String secondJarPath=Myclass.class.getResource("jar2.jar").getPath(); 

    //An exception is thrown 
    JarFile secondJar = new JarFile(secondJarPath); 

    JarEntry entry =secondJar.getJarEntry("file.txt"); 
    InputStream inputStream = entry.getInputStream(entry); 
    String content= IOUtils.toString(inputStream, Charset.forName("UTF-8")); 

} 
catch(IOException e){ 
} 

然而,一個例外是在該行拋出「jar文件secondJar =新的JarFile(secondJarPath);」,稱「文件名,目錄名或卷標語法不正確「

任何人都可以幫助我嗎?

感謝

+1

是不是提取'jar1'一個選項'jar2'? – fge 2015-02-17 22:00:32

+0

你是什麼意思? – michelle 2015-02-17 22:01:26

回答

1
try{ 
    String firstJarPath = Junk.class.getResource("jar1.jar").getPath(); 
    JarFile firstJar = new JarFile(firstJarPath); 
    JarEntry entry = firstJar.getJarEntry("jar2.jar"); 

    InputStream isJar2 = firstJar.getInputStream(entry); 
    JarInputStream jisJar2 = new JarInputStream(isJar2); 
    JarEntry textFileEntry = jisJar2.getNextJarEntry(); 

    if (textFileEntry.isDirectory()) { 
     jisJar2.close(); 
     firstJar.close(); 
     throw new Exception("didn't expect a directory"); 
    } else { 
     int size = (int) textFileEntry.getSize(); 
     if (size <= 0) { 
      System.out.print("ignore entry " + textFileEntry.getName() + " as size=" + size); 
     } else { 
      byte[] fileBytes = new byte[size]; 
      IOUtils.read(jisJar2, fileBytes, 0, size); 
      ByteArrayInputStream ibs = new ByteArrayInputStream(fileBytes); 
      // ibs should be your file, so now do something with it.... 
     } 
    } 
    jisJar2.close(); 
    firstJar.close(); 

} 

catch(IOException e){ 
} 
+0

你可以把完整的代碼?謝謝 – michelle 2015-02-17 22:07:31

+0

@michelle嘗試編輯後的版本 – 2015-02-17 22:55:04