簡體   English   中英

如何修復 stream 錯誤:可能無法關閉 stream 錯誤

[英]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 而不管塊如何退出(即通過正常完成、 catchfinally子句)。

S3ObjectBufferedReader也是如此。 它們都可以在同一個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

上面實際上有兩個托管資源: s3Responsereader 關閉兩者可能不是絕對必要的,但是(IMO)無論如何關閉它們是正確的做法......從可讀性的角度來看,如果沒有別的。

(也可以更簡單和/或更有效地執行“將內容作為字符串讀取”,但這不在此問題的 scope 范圍內。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM