1

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

実際、私が使用している Jar ファイルには、絶対にファイルシステムに抽出しなければならないファイルが含まれています。

今のところ Class.getResourceAsStream と FileOutputStream を使用していますが、この方法はやや遅いです。これらのファイルの一部はテキストベースですが、その他は単純なバイナリです。

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

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

編集:将来の参考のために、私の古い(非効率な)コードは次のとおりです。

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

新しい、はるかに高速なコードについては、受け入れられた返信を参照してください。

4

3 に答える 3

8

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 ファイルを抽出する場合と比べてどうですか?

于 2009-06-20T18:29:51.250 に答える
0

私はジョンに同意します。2つのことが抽出を高速化します。

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

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

于 2009-06-20T19:07:02.017 に答える