InputStream 关​​闭和声纳问题

InputStream closes and sonar issues

我有以下代码可以打开包含多个文件的 zip 文件,并从每个文件中提取信息:

public static void unzipFile(InputStream zippedFile) throws IOException {
  try (ZipInputStream zipInputStream = new ZipInputStream(zippedFile)) {
    for (ZipEntry zipEntry = zipInputStream.getNextEntry(); zipEntry != null; zipEntry = zipInputStream.getNextEntry()) {
      BufferedReader reader = new BufferedReader(new InputStreamReader(new BoundedInputStream(zipInputStream, 1024)));
      //Extract info procedure...
    } 
  }
}

总而言之,我从 zip 文件中选取每个文件,然后用 BufferedReader 打开它以读取其中的信息。我还使用 BoundedInputStream (org.apache.commons.io.input.BoundedInputStream) 来限制缓冲区大小并避免文件上出现不需要的大行。

它按预期工作,但是我在 Sonar 上收到此警告:

Use try-with-resources or close this "BufferedReader" in a "finally" clause.

我无法关闭(或使用 try-with-resources,就像我在方法开始时所做的那样)我创建的 BufferedReader - 如果我调用关闭方法,ZipInputStream 将关闭。 ZipInputStream 已经在 try-with-resources...

此声纳通知被标记为严重,但我认为它是误报。我想知道你是否可以向我澄清 - 我是否正确,或者我应该以不同的方式处理这个问题?我不想在代码中留下资源泄漏,因为此方法将被调用多次,泄漏可能会造成严重损害。

声纳通知是正确的,因为技术上存在资源泄漏,随着时间的推移可能会耗尽资源(参见 garbage collection and IO classes). In order to avoid closing the underlying ZipInputStream, consider passing the ZipEntry into the BoundedInputStream in the for loop as per this SO question: reading files in a zip file。因此,当 BufferedReader 关闭时,BoundedInputStream 已关闭,而不是 ZipInputStream.

感谢这里的回答,我可以这样解决我的问题:

BoundedInputStream boundedInputStream = new BoundedInputStream(zipInputStream, MAX_LINE_SIZE_BYTES);
boundedInputStream.setPropagateClose(false);

try(BufferedReader reader = new BufferedReader(new InputStreamReader(boundedInputStream))) { ...

使用 boundedInputStream.setPropagateClose(false); 我可以在不关闭 zipInputStream 的情况下关闭 BufferedReader