繁体   English   中英

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

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

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

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

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

声纳通知是正确的,因为从技术上讲,存在资源泄漏,随着时间的流逝可能会耗尽资源(请参阅垃圾回收和IO类 )。 为了避免关闭底层的ZipInputStream ,请按照以下SO问题: 在zip文件中读取 ZipEntry到for循环中的BoundedInputStream中。 因此,当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); 我可以关闭BufferedReader而不关闭zipInputStream。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM