4

inputStreamを閉じて宣言するための推奨される方法は、次のうちどれですか。

InputStream is = null; 
String md5;
try{
    is = new FileInputStream(FILE.getAbsoluteFile());
    md5 = UTILS.getMD5Info(is);
} finally{
    if(is != null) 
        is.close();
}

また

InputStream is = new FileInputStream(FILE.getAbsoluteFile()); 
String md5;
try{
    md5 = UTILS.getMD5Info(is);
} finally{
    is.close();
}

両者の違いはあまりわかりませんが、2番目の方法は少し短いので見栄えが良くなります。例外をキャッチせず、inputStreamのガベージコレクションに関心がある場合は、tryブロック内で入力ストリームを初期化する方法はありますか?

4

3 に答える 3

6

tryとfinallyの間にIOExceptionがキャッチされた場合、最初のコンストラクターはFileInputStreamのコンストラクターがIOExceptionをスローする場合も処理しますが、2番目のコンストラクターはIOExceptionをスローしません。彼らは同じことをしません。現状では、2番目のものはよりクリーンです。

Java 7以降、最善の方法は、try-with-resourcesステートメントを使用することです。

try (InputStream is = new FileInputStream(FILE.getAbsoluteFile())) {
    md5 = UTILS.getMD5Info(is);
}
于 2012-05-15T13:10:45.967 に答える
6

Java 7機能のtry-with-resourcesを使用するのはどうですか?

try (InputStream is = new FileInputStream(FILE.getAbsoluteFile())) {
    ...
} catch (IOException e) {
    e.printStackTrace();
}

あなたが絶対的に正確になりたいのならそれはかなり醜いので(どんな読者もIOException追加を投げるかもしれないことを忘れないでくださいclose()!):

InputStream is = null;

try {
    is = new FileInputStream(FILE.getAbsoluteFile());

    // Your md5() magic here

} catch (FileNotFoundException e) {
    e.printStackTrace();
} catch (IOException e) {
    e.printStackTrace();
} finally {
    if (is != null) {
        try {
            is.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

2番目のバージョンでは、コンストラクターが例外をスローした場合(たとえば、ファイルが見つからないか、ファイルにアクセスするための特権がない場合)、ケースを処理しません。

その場合も処理したい場合はInputStream、ブロックの前にbeforeを宣言する(または現在の関数定義にtry-catch追加する)必要があります。throws IOException

ただし、正しく初期化されているかどうか、つまりブロックnull内にないかどうかを確認する必要があります。finally

さらに、close()ストリームを作成する場合は、可能性を処理する必要がありますIOException(通常、ストリームを開くことができた場合、これは発生しません)。

于 2012-05-15T13:11:42.753 に答える
4

2番目のアプローチの問題は、FileInputStreamコンストラクターが指定したtryブロック内でキャッチしない例外をスローする可能性があるFileNotFoundExceptionため(そのような例外をキャッチしたい場合)、このアプローチでは制御が弱くなることです。

私は最初のものと一緒に行きます。

于 2012-05-15T13:09:13.987 に答える