我是否需要关闭ByteArrayInputStream?

时间:2011-02-25 14:11:09

标签: java garbage-collection inputstream

简短的问题,

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

new BufferedReader(new InputStreamReader(new ByteArrayInputStream(somebytes)));

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

我总是(曾经)在finally语句中了解到需要关闭输入/输出流。 ByteStreams是此规则的例外吗?

亲切的问候 的Jeroen。

4 个答案:

答案 0 :(得分:40)

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

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

如果您对关闭流并被迫处理不可能IOException感到无聊,可以使用IOUtils

IOUtils.closeQuietly(stream);

答案 1 :(得分:7)

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

答案 2 :(得分:1)

需要在finally(或等效的)中关闭资源。但是你只有一些字节,没关系。虽然在写作时,在快乐的情况下要小心flush

答案 3 :(得分:1)

正如@TomaszNurkiewicz所说,关闭打开的流总是好的。另一个让它自己尝试阻止的好方法。使用尝试资源,如.......

try ( InputStream inputStream = new ByteArrayInputStream(bytes); Workbook workBook = new XSSFWorkbook(inputStream)) { 

这里Workbook和InputStream都实现了可关闭接口,所以一旦尝试块完成(正常或突然),流将被关闭肯定。