聲納引發了fileStream未在下面的代碼中關閉的問題。但是,它是在lambda表達式中。如何解決聲納問題:當流真的關閉,但在lambda中時,流並未關閉
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) {
...
}
當我改變它,使用try-與資源模式,然後我得到異常:產生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) {
...
}
因此第二個解決方案解決了sonar檢測到的bug,但是它只是在lambda代碼被調用之前關閉fileStream時不起作用。
你會建議如何解決它?
如果發生異常,該方法可能會在outputStream.close()調用完成之前跳出。將close命令添加到catch塊或使用try-with-resource來解決此問題。 – Korashen