11

出力ストリームを閉じる必要がある場合、2 つの選択肢があります。

  1. closeQuietly は、例外をスローせずにストリームを閉じることを意味します。

    try {
        close(out)
    } catch(IOException e) {
    }
    
  2. 近い

    try {
        close(out)
    } catch(IOException e) {
        throw anException;
    }
    

知られているように、出力ストリームはファイルを閉じるときにいくつかの文字をファイルの最後に書き込みます。これらの書き込みが間違っていると、ZipoutputStream などのファイルも正しく開くことができません。

最初のものを使用すると、クローズに失敗するリスクがあります。2 番目のものを使用すると、コードが使いにくくなります。

誰かアドバイスをくれませんか?

問題を不明確に説明して申し訳ありません。

IO操作を安全に取得する方法を意味しました。リソースの解放が失敗した場合、呼び出し元に通知されます。

ご回答ありがとうございます。特に、@Fabian Barney が回答した最良の回答を含むリンクを提供してくれた @Don Roby に感謝します。

4

4 に答える 4

16

Java 7IOUtils.closeQuietlyが時代遅れになったため、唯一の合理的な解決策はtry-with-resources、リソースを自動的に閉じることです。

try (InputStream is = new FileInputStream(file)) {
    ...
}

複数のリソースを正しく開いたり閉じたりする際の問題も解決することに注意してください

try (InputStream is = new FileInputStream(infile); OutputStream out = new FileOutputStream(outfile)) {
   ...          
}

close()また、スローされる可能性のあるIOException も抑制しませんcloseQuietly

于 2013-06-04T10:24:42.077 に答える
2

の一部の実装には、最終バイトの書き込みやデータの 'ingclose()などの他のロジックが含まれる場合があります。flush()例はFilterOutputStreamです。

ストリームがネットワーク チャネルまたは外部 USB ドライブに基づいている場合の状況をイメージします。どちらもいつでも消える可能性があります。close() の実行時に発生する可能性があります。

したがって、私の意見: IOException をキャッチし、次のような原因例外を含むアプリケーション固有の例外をスローします。

} catch (IOException e)
{
    throw new IOManagementException(e);
}

例外をスローしないことに固執している場合は、少なくとも ERROR ステータスの場合はログに記録します。

そうしないと、バグレポートの分析が非常に困難になったり、奇妙な動作が発生したりする可能性があります。

于 2013-06-04T10:36:40.260 に答える