Java 输入流关闭和声纳问题

Java 输入流关闭和声纳问题,java,sonarqube,bufferedreader,file-handling,zipfile,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

我使用以下代码打开包含多个文件的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
)来限制缓冲区大小并避免文件上不需要的大行

它按预期工作,但我在声纳上得到警告:

Use try-with-resources or close this "BufferedReader" in a "finally" clause.
我无法关闭(或使用try with resources,就像我在方法开头所做的那样)我创建的BufferedReader-如果我调用close方法,
ZipInputStream
将关闭。而
ZipInputStream
已经在使用资源进行尝试


这个声纳通知被标记为关键,但我认为这是一个误报。我想知道你是否可以向我澄清——我是对的,还是应该用另一种方式来处理?我不想在代码中留下资源泄漏,因为此方法将被调用多次,泄漏可能会造成严重损害。

sonar通知是正确的,因为从技术上讲,资源泄漏可能会随着时间的推移耗尽资源(请参阅)。为了避免关闭基础<代码> ZIPunPoStuts,请考虑将<代码> ZIPAccess >按以下问题:因此,当
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。

我没有像您链接的问题那样的
ZipFile
。不需要
ZipFile
,链接该答案的目的是强调可以从
ZipEntry
创建输入流,因此,可以将一个
BufferedReader
层放在上面,并关闭所述读卡器,而无需关闭提供条目的
ZipInputStream