java - 输入流关闭和 Sonar 问题

标签 java sonarqube bufferedreader file-handling zip

我有以下代码来打开包含多个文件的 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,就像我在方法开头所做的那样)我创建的 BufferedReaders - 如果我调用 close 方法,ZipInputStream 将关闭。并且 ZipInputStream 已经在 try-with-resources 下...

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

最佳答案

Sonar 通知是正确的,因为技术上存在资源泄漏,随着时间的推移可能会耗尽资源(请参阅 garbage collection and IO classes )。为了避免关闭底层的 ZipInputStream,请考虑按照以下 SO 问题将 ZipEntry 传递到 for 循环中的 BoundedInputStream 中:reading files in a zip file 。因此,当 BufferedReader 关闭时,BoundedInputStream 也将关闭,而不是 ZipInputStream

关于java - 输入流关闭和 Sonar 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55872807/

相关文章:

java - 使用 readline() 和 split()

java - 使用 BufferedReader 将文件内容存储在 Integer 的 ArrayList 中

java - 编辑距离是解决此编辑步骤问题的正确方法吗?

java - Netbeans 6.9 的 SOA 插件

java-native-interface - jdk1.0 为何缺乏原生代码和 Java 代码之间的清晰分离?

unit-testing - 没有 Sonar 报告单元测试成功

jenkins - 分析成功但加载失败

java - 读取站点源: � characters

java - 如何覆盖 AEM 中 RSS 源的默认功能?

java - 从 Eclipse 实例运行 Sonar 代码分析