2011-10-18 154 views
2

我需要一個文件filename.txt這是一個jar文件。我如何使用代碼讀取txt文件的內容?是否有可用於處理* .jar文件的庫?如何從jar中獲取文件?

+0

你想要得到它編程,還是隻是提取它?如果前者,是類路徑中的yyy.jar還是不? –

回答

3
public class Test { 
    public static void main(String[] args) { 
     InputStream stream = Test.class.getResourceAsStream("/test.txt"); 
     Scanner s = new Scanner(stream); 
     while (s.hasNext()) { 
      System.out.println(s.next()); 
     } 
    } 
} 

該jar需要位於應用程序的類路徑中。

此代碼將搜索所有jar的根目錄下的test.txt文件。

如果您需要指定一個不在類路徑中的jar,那麼其他建議可能更有價值。

+0

如果jar不在類路徑中,則可以創建自定義類加載器,並從中加載資源。 – MeBigFatGuy

0

用任何壓縮工具軟件打開它。 .jar只是一個.zip文件。

+1

我需要它在Java代碼中。我是程序員,而不是用戶。 – shift66

+0

然後,您可以使用java提供的ZIP API來執行此操作。創建ZipInputStream,獲取ZipEntry並檢查名稱以獲取文件:) – Saurabh

2

是否有用於處理* .jar文件的庫?

是的,有java.util.zip(jar文件是有效的ZIP文件,more here),在JDK本身(無需第三方LIB)。

另請參閱Oracle網站上的this article,其中提供了示例等。下面是他們的第一個例子的代碼,從歸檔(不是我的代碼,當然最喜歡的例子有誤差不足檢查等)解壓縮所有文件:

import java.io.*; 
import java.util.zip.*; 

public class UnZip { 
    final int BUFFER = 2048; 
    public static void main (String argv[]) { 
     try { 
     BufferedOutputStream dest = null; 
     FileInputStream fis = new FileInputStream(argv[0]); 
     ZipInputStream zis = new ZipInputStream(new BufferedInputStream(fis)); 
     ZipEntry entry; 
     while((entry = zis.getNextEntry()) != null) { 
      System.out.println("Extracting: " +entry); 
      int count; 
      byte data[] = new byte[BUFFER]; 
      // write the files to the disk 
      FileOutputStream fos = new FileOutputStream(entry.getName()); 
      dest = new BufferedOutputStream(fos, BUFFER); 
      while ((count = zis.read(data, 0, BUFFER)) != -1) { 
       dest.write(data, 0, count); 
      } 
      dest.flush(); 
      dest.close(); 
     } 
     zis.close(); 
     } catch(Exception e) { 
     e.printStackTrace(); 
     } 
    } 
} 
3

如果罐子在classpath ,您可以使用getClass().getClassLoader().getResourceAsStream(...)訪問文件。如果jar文件不在類路徑中,則檢查出java.util.jar.JarFile

1

你不需要一個單獨的庫。默認的壓縮包可以很好地工作。

private String getFile(File jar, String requestedFile) throws IOException{ 
    ByteArrayOutputStream out = new ByteArrayOutputStream(); //change ouptut stream as required 
    ZipInputStream in = null; 
    try { 
     in = new ZipInputStream(new FileInputStream(jar)); 
     ZipEntry entry; 
     while((entry = in.getNextEntry())!=null){ 
      if (entry.getName().equals(requestedFile)){ 

       byte[] buf = new byte[1024]; 
       int len; 
       while ((len = in.read(buf)) > 0) { 
        out.write(buf, 0, len); 
       } 
      } 
     } 
    } finally { 
     if (in!=null){ 
      in.close(); 
     } 
     out.close(); 

    } 
    return new String(out.toByteArray()); 
} 
0

首先檢查其中yyy.jar是你xxx.txt位於

jar tf yyy.jar

樣本輸出

META-INF/MANIFEST.MF 
images/pic.gif 
files/abc.txt 
files/xxx.txt 

現在你知道xxx.txt路徑,

提取物它由

jar xf yyy.jar files/xxx.txt 
1

下面的命令應該工作:

jar xf yyy.jar files/xxx.txt

確保使用正確的JDK的罐子包裝回用

jar uf yyy.jar files/xxx.txt