简短的问题,
我在一些旧代码中看到ByteArrayInputStream
创建如下:
new BufferedReader(new InputStreamReader(new ByteArrayInputStream(somebytes)));
然后BufferedReader
用于逐行读出somebytes
一切正常,但我注意到BufferedReader
永远不会关闭
这一切都在长时间运行的websphere应用程序中运行,somebytes
并不是很大(最多200k),它只是每周调用几次而且我们没有遇到任何明显的内存泄漏。所以我希望所有对象都能成功地进行垃圾收集。
我总是(曾经)在finally
语句中了解到需要关闭输入/输出流。 ByteStreams
是此规则的例外吗?
答案 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都实现了可关闭接口,所以一旦尝试块完成(正常或突然),流将被关闭肯定。