[英]How to fix stream error: may fail to close stream error
我正在寫一個方法,但看到這個錯誤:可能無法關閉 stream。 根據不同帖子上的一些解決方案,我在 finally 塊中添加了 try 和 catch 。 我還添加了 IOUtils.closeQuietly(fullObject, (Log) LOGGER)。 但它仍然不起作用。 有誰能幫忙看看嗎? 謝謝!
S3Object fullObject = null;
StringBuffer buffer = new StringBuffer();
try {
S3Object s3Response = s3Client.getObject(s3BucketName, s3Key);
BufferedReader reader = new BufferedReader(new InputStreamReader(s3Response.getObjectContent()));
String line;
while ((line = reader.readLine()) != null) {
buffer.append(line);
}
} finally {
if (fullObject != null) {
try {
fullObject.close();
} catch (IOException ex) {
throw new RuntimeException(ex);
}
IOUtils.closeQuietly(fullObject, (Log) LOGGER);
}
}
return buffer.toString();
}
InputStreamReader
實現AutoCloseable
。 這意味着預期用途是try-with-resources
:
try (InputStreamReader reader = new InputStreamReader(s3Response.getObjectContent()) {
...
}
這應該總是關閉 stream 而不管塊如何退出(即通過正常完成、 catch
或finally
子句)。
S3Object
和BufferedReader
也是如此。 它們都可以在同一個try
塊中聲明為資源。
有關詳細信息,請參閱https://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html 。
您應該使用 Java 7+ 嘗試資源。 它將負責關閉您在列表中聲明的資源。 在關閉過程中可能拋出的任何異常都會得到適當的處理。 (它們要么被允許傳播,要么在異常已經傳播時被“抑制”。)
您使用資源嘗試的代碼如下所示。 它是原始版本的一半長度,並且不會有任何資源泄漏。 你“贏”了兩種方式。
try (S3Object s3Response = s3Client.getObject(s3BucketName, s3Key);
BufferedReader reader = new BufferedReader(
new InputStreamReader(s3Response.getObjectContent()));
)
{
StringBuffer buffer = new StringBuffer();
String line;
while ((line = reader.readLine()) != null) {
buffer.append(line);
}
return buffer.toString();
}
請注意,我已經擺脫了您的代碼未使用的fullObject
。
上面實際上有兩個托管資源: s3Response
和reader
。 關閉兩者可能不是絕對必要的,但是(IMO)無論如何關閉它們是正確的做法......從可讀性的角度來看,如果沒有別的。
(也可以更簡單和/或更有效地執行“將內容作為字符串讀取”,但這不在此問題的 scope 范圍內。)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.