0

私はこのArrayListファイルを持っています

for(File file : files){

    InputStream in = FileInputStream(file);
    // process each file and save it to file
    OutputStream out = FileOutputStream(file);
    try{

    } finally {
       in.close();
       out.close();
    }
}

すべてのループに in/out close() があるため、パフォーマンスが非常に遅くなります。これを行うためのより良い方法はありますか? 出力ストリームをループの外に置こうとしましたが、うまくいきません。

4

3 に答える 3

1

close() には最大 20 ミリ秒かかる場合があります。何千ものファイルがない限り、これがあなたのプログラムだとは思えません。

あなたのパフォーマンスの問題は、入力と出力のバッファリングが不足していると思われます。バッファリング ラッパーも表示できますか?

于 2011-04-26T15:43:37.230 に答える
1

バッファリングされたストリームを使用すると、大きな違いが生じます。

これを試して:

for(final File file : files) {

    final InputStream in = new BufferedInputStream(new FileInputStream(file));
    final OutputStream out = new BufferedOutputStream(new FileOutputStream(new File(...)));
    try {
        // Process each file and save it to file
    }
    finally {
        try {
            in.close();
        }
        catch (IOException ignored) {}
        try {
            out.close();
        }
        catch (IOException ignored) {}
    }
}

IOExceptionストリームを閉じるときにスローされる可能性のある s は無視する必要があることに注意してください。そうしないと、潜在的な初期例外が失われます。

もう 1 つの問題は、両方のストリームが同じファイル上にあることです。これは機能しません。したがって、2 つの異なるファイルを使用していると思います。

于 2011-04-26T15:48:05.740 に答える
0

もちろん、OutputStreams のキューを構築し、これらの出力ストリームのクローズを処理するバックグラウンド スレッドにオフロードすることもできます。InputStreams についても同じです。別の方法として、それを JVM に任せることもできます。オブジェクトがファイナライズされたときに、ファイルを閉じずに GC に任せてください。

于 2011-04-26T15:46:43.073 に答える