InputStream关闭并出现声纳问题

时间:2019-04-26 17:58:13

标签: java sonarqube bufferedreader file-handling zipfile

我有以下代码来打开一个包含多个文件的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打开它以从中读取信息。我还使用BoundedInputStreamorg.apache.commons.io.input.BoundedInputStream)来限制缓冲区大小并避免在文件上出现多余的大行。

它能按预期工作,但是我在声纳上得到了这个警告:

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

我只是无法关闭(或使用 try-with-resources ,就像我在方法开始时所做的那样)创建的BufferedReaders-如果我调用close方法,{{ 1}}将关闭。并且ZipInputStream已经在 try-with-resources ...

此声纳通知被标记为严重,但我相信这是一个误报。我想知道您是否可以向我澄清-我是否正确,还是应该以其他方式处理?我不想在代码中留下资源泄漏,因为此方法将被调用多次,泄漏可能会造成严重的破坏。

2 个答案:

答案 0 :(得分:1)

声纳通知是正确的,因为从技术上讲,存在资源泄漏,随着时间的流逝可能会耗尽资源(请参阅garbage collection and IO classes)。为了避免关闭基础的ZipInputStream,请考虑按照以下问题reading files in a zip fileZipEntry传递到for循环中的BoundedInputStream中。因此,当BufferedReader关闭时,BoundedInputStream关闭而不是ZipInputStream

答案 1 :(得分:1)

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

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

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

使用boundedInputStream.setPropagateClose(false);,我可以关闭BufferedReader,而无需关闭zipInputStream。