我是否需要关闭ByteArrayInputStream?

dr *_*rry 43 java garbage-collection inputstream

简短的问题,

我在一些旧代码中看到a ByteArrayInputStream创建如下:

new BufferedReader(new InputStreamReader(new ByteArrayInputStream(somebytes)));
Run Code Online (Sandbox Code Playgroud)

然后BufferedReader用来somebytes逐行读出.
一切正常,但我注意到它BufferedReader永远不会关闭.
这一切都在长时间运行的websphere应用程序中运行,somebytes并不是很糟糕(最多200k),它每周只调用几次而且我们没有遇到任何明显的内存泄漏.所以我希望所有对象都能成功地进行垃圾回收.

我总是(曾经)在一个finally声明中了解到需要关闭输入/输出流.ByteStreams这个规则是例外吗?

亲切的问候Jeroen.

Tom*_*icz 44

您不必关闭ByteArrayInputStream,当它没有被任何变量引用时,垃圾收集器将释放流并且somebytes(当然假设它们未在其他地方引用).

但是,关闭每个流总是一个好习惯,事实上,创建流的实现可能会在未来发生变化,而不是原始字节,您将读取文件?此外,PMD或FindBugs等静态代码分析工具(请参阅注释)很可能会抱怨.

如果你厌倦了关闭流并被迫处理不可能IOException,你可以使用IOUtils:

IOUtils.closeQuietly(stream);
Run Code Online (Sandbox Code Playgroud)

  • findbugs非常聪明,不会报告BAIS/BAOS没有被关闭. (8认同)

jzd*_*jzd 7

关闭读者始终是一种好习惯.但是,不关闭ByteArrayInputStream不会产生潜在的负面影响,因为您没有访问文件,只是内存中的字节数组.

  • ByteArrayInputStream的文档将确认close()不执行任何操作.但是保持关注溪流的做法是个好主意.您可能稍后重构以使函数接受其他类型的流. (3认同)