2009-06-20 59 views
1

我有一個用Java編寫的應用程序,它使用了一個jar文件(它使用了多個,但這不是重點)。從jar高效提取文件

事實是,我使用的Jar文件包含了我絕對要解壓到文件系統中的文件。

到目前爲止,我使用Class.getResourceAsStream和FileOutputStream中,但這種方法是有點慢。 請注意,其中一些文件是基於文本的,但其他文件只是二進制文件。

所以從試圖減少需要從JAR文件中提取文件分開,對於這些任務有任何的優化(如更多adequated功能)。

請注意,我的應用程序是Java 6的基礎,我想,以減少外部依賴降到最低。

編輯:對於未來的參考,我OLD(inefficent)代碼爲:

int c; 
while((c = is.read())!=-1){ 
    fos.write(c); 
} 

對於新的,更快的代碼,請參見接受的答覆。

回答

7

你有控制jar文件嗎?如果你創建它未壓縮,那可能使它更快。很顯然,這會讓這個JAR文件雖然大...

另一件事來檢查 - 你是如何解壓文件?例如,如果你逐字節地做,它將會非常緩慢。使用像這樣的東西:

public static void copyStream(InputStream input, OutputStream output) 
    throws IOException 
{ 
    // Reads up to 8K at a time. Try varying this. 
    byte[] buffer = new byte[8192]; 
    int read; 

    while ((read = input.read(buffer)) != -1) 
    { 
     output.write(buffer, 0, read); 
    } 
} 

如果你已經這樣做了,你能給我們提供更多的信息嗎? 「有點慢」有多慢?比如說,如何使用jar實用程序來提取jar文件?

+0

我真的在逐字節拷貝! 現在它顯着更快!謝謝! – luiscubal 2009-06-20 18:52:26

1

Err。我不確定你真的想做什麼 - 但你有沒有想過使用winzip?

顯然,如果你需要在運行時這將無法工作動態提取文件 - 但我不知道爲什麼你需要做到這一點 - 如何經常幹這種事jar文件的變化?

當然,您可以提取一次,然後將它們分發給應用程序?

0

我同意喬恩。 2件事會使提取更快:

  1. 降低壓縮級別。
  2. 增加複製/提取時使用的緩衝區大小。

我認爲需要提取是由於需要寫入/重新讀取文件。如果文件足夠小,內存足夠大,並且不需要文件的持久性;您可能會考慮將整個資源映射到內存,而不是將磁盤用作存儲。

+0

該文件大約是165KB。該jar與NetBeans輸出一樣壓縮。 – luiscubal 2009-06-20 19:18:45