2009-06-20 16 views
1

jarファイルを使用するJavaで書かれたアプリケーションがあります(複数のファイルを使用しますが、それは重要ではありません)。jarファイルの効率的な抽出

私が使用しているJarファイルには、絶対にファイルシステムに抽出する必要があるファイルが含まれています。

これまでのところ、私はClass.getResourceAsStreamとFileOutputStreamを使用していますが、この方法はやや遅いです。 これらのファイルの一部はテキストベースですが、他のファイルは単純にバイナリであることに注意してください。

したがって、JARからファイルを抽出する必要性を減らすこととは別に、これらのタスクの最適化(より適切な機能など)があります。

私のアプリケーションはJava 6ベースであり、外部依存関係を最小限に抑えたいと考えています。

EDIT:今後の参考のために、私のOLD(inefficent)コードはでした:新しい、非常に高速なコードについては

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

、受け入れの回答を参照してください。

答えて

7

jarファイルを制御できますか?あなたが圧縮されていない場合は、になる可能性があります。明らかに、それはjarファイルを大きくするでしょう...

もう1つのことを確認する - ファイルをどのように抽出していますか?たとえば、バイト単位で処理している場合、それは辛いほど遅くなります。

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

1

Err。あなたが本当にやりたいことはわかりませんが、あなたはwinzipを使うことを考えましたか?

実行時にファイルを動的に抽出する必要がある場合、これはうまくいかないでしょうが、なぜこれを行う必要があるのか​​よく分かりません。このjarファイルの変更頻度はどれくらいですか。

確かにそれらを1回抽出して、アプリケーションで配布できますか?

0

私はJonと同意します。 2つのものが高速に抽出されます。

  1. 圧縮レベルを下げます。
  2. コピー/抽出時に使用するバッファサイズを増やします。

抽出する必要があるのは、ファイルからの書き込み/再読み込みの必要があるためです。ファイルが十分に小さい場合、メモリは十分に大きく、ファイルの永続的な性質は要件ではありません。ディスクをストレージとして使用する代わりに、リソース全体をメモリにマッピングすることを検討することもできます。

+0

ファイルは約165KBです。 jarファイルは、NetBeansが出力する圧縮形式です。 – luiscubal