ソナーはfileStreamが以下のコードで閉じられていないという問題を提起します。しかしそれはラムダ式ですが、ソナーの問題を解決する方法:ストリームが実際に閉じられているがラムダで閉じられていない場合
try {
final InputStream fileStream = new FileInputStream(copy);
return (OutputStream outputStream) -> {
int n;
byte[] buffer = new byte[1024];
while ((n = fileStream.read(buffer)) > -1) {
outputStream.write(buffer, 0, n);
}
fileStream.close();
};
} catch (IOException exception) {
...
}
私はそれを変更して使用してみてください-リソースとパターン、私は例外を取得:にjava.io.IOException:ストリームクローズを読んでFILESTREAMの行に:
try (final InputStream fileStream = new FileInputStream(copy)) {
return (OutputStream outputStream) -> {
int n;
byte[] buffer = new byte[1024];
while ((n = fileStream.read(buffer)) > -1) {
outputStream.write(buffer, 0, n);
}
};
} catch (IOException exception) {
...
}
したがって2番目の解決策はソナーによって検出されたバグを解決しますが、ラムダコードが呼び出される前にfileStreamがクローズされても機能しません。
あなたはそれを修正するために何をお勧めしますか?
例外が発生した場合、outputStream.close()の呼び出しが完了する前にメソッドが飛び出すことがあります。 catchコマンドにcloseコマンドを追加するか、try-with-resourceを使用してこれを修正してください。 – Korashen