質問
jarファイルを使用するJavaで記述されたアプリケーションがあります(複数使用しますが、それはポイントではありません)。
実際、私が使用しているJarファイルには、ファイルシステムに絶対に抽出しなければならないファイルが含まれています。
これまでのところ、Class.getResourceAsStreamとFileOutputStreamを使用していますが、このメソッドはやや遅いです。 これらのファイルの一部はテキストベースですが、その他は単にバイナリであることに注意してください。
JARからファイルを抽出する必要性を削減しようとするのとは別に、これらのタスクに最適化(より適切な機能など)があります。
アプリケーションはJava 6ベースであり、外部の依存関係を最小限に抑えたいことに注意してください。
編集:将来の参考のために、私の OLD (非効率)コードは次のとおりでした:
int c;
while((c = is.read())!=-1){
fos.write(c);
}
より高速な新しいコードについては、承認済みの返信をご覧ください。
解決
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ファイルを抽出する場合と比較してどうですか?
他のヒント
エラー。あなたが本当に何をしたいのかわかりませんが、winzipの使用について考えましたか?
明らかに、実行時にファイルを動的に抽出する必要がある場合、これは機能しません。
確かにそれらを一度抽出してからアプリケーションとともに配布できますか?
私はジョンに同意します。 2つのことが抽出を高速化します:
- 圧縮レベルを下げる。
- コピー/抽出時に使用されるバッファサイズを増やす。
抽出する必要があるのは、ファイルの書き込み/再読み取りの要件によるものだと思います。ファイルが十分に小さい場合、メモリは十分に大きく、ファイルの永続的な性質は要件ではありません。ディスクをストレージとして使用する代わりに、リソース全体をメモリにマッピングすることを検討してください。