Java 我需要关闭ByteArrayInputStream吗?

Java 我需要关闭ByteArrayInputStream吗?,java,garbage-collection,inputstream,Java,Garbage Collection,Inputstream,简短的问题 try ( InputStream inputStream = new ByteArrayInputStream(bytes); Workbook workBook = new XSSFWorkbook(inputStream)) { 我在一些旧代码中看到一个ByteArrayInputStream是这样创建的: new BufferedReader(new InputStreamReader(new ByteArrayInputStream(somebytes))); try

简短的问题

try ( InputStream inputStream = new ByteArrayInputStream(bytes); Workbook workBook = new XSSFWorkbook(inputStream)) { 
我在一些旧代码中看到一个
ByteArrayInputStream
是这样创建的:

new BufferedReader(new InputStreamReader(new ByteArrayInputStream(somebytes)));
try ( InputStream inputStream = new ByteArrayInputStream(bytes); Workbook workBook = new XSSFWorkbook(inputStream)) { 
然后使用
BufferedReader
逐行读取
somebytes

一切正常,但我注意到,
BufferedReader
从未关闭。
这都是在一个长时间运行的websphere应用程序中工作的,
somebytes
不是很大(大多数为200k),它一周只被调用几次,而且我们没有遇到任何明显的内存泄漏。因此,我希望所有对象都能成功地被垃圾收集

try ( InputStream inputStream = new ByteArrayInputStream(bytes); Workbook workBook = new XSSFWorkbook(inputStream)) { 
我总是(曾经)知道输入/输出流需要在
finally
语句中关闭。
ByTestStreams
是否是此规则的例外

try ( InputStream inputStream = new ByteArrayInputStream(bytes); Workbook workBook = new XSSFWorkbook(inputStream)) { 
问候
Jeroen.

资源需要在
中最终关闭(或等效)。但是如果你只有一些字节,没有关系。尽管在写作时,要小心在高兴的情况下冲洗。

关闭阅读器始终是一种良好的做法。但是,不关闭ByteArrayInputStream不会有太大的潜在负面影响,因为您不是在访问文件,而是在内存中的字节数组。

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

try ( InputStream inputStream = new ByteArrayInputStream(bytes); Workbook workBook = new XSSFWorkbook(inputStream)) { 
然而关闭每个流始终是一个好的做法,事实上,创建流的实现可能会在将来发生变化,您将读取文件而不是原始字节?此外,PMD或FindBugs等静态代码分析工具(见注释)也很可能会抱怨

try ( InputStream inputStream = new ByteArrayInputStream(bytes); Workbook workBook = new XSSFWorkbook(inputStream)) { 
如果您厌倦了关闭流并被迫处理不可能的
IOException
,您可以使用:

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

正如@TomaszNurkiewicz提到的,关闭打开的流总是好的。另一种让它自己做try块的好方法。使用try with resource,比如

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

在这里,工作簿和InputStream都实现了Closeable接口,所以一旦try块完成(正常或突然),流肯定会关闭。

ByteArrayInputStream的文档将确认close()什么都不做。但最好还是保持对流调用close的习惯。以后可能会进行重构,使函数接受其他类型的流。
close()
按设计必须首先刷新。@bestsss不管您如何调用
flush
。无需关闭
也可以显式关闭。我认为可能还有一些不可能的
IOException
在那里,因为代码实际上根本没有处理任何I/O!findbugs足够聪明,不会报告BAI/BAOing关闭。@Tom Hawtin-tacklin:检查异常的美妙之处:-(事实上,如果以某种方式使用,您可能会得到EOF异常,不是吗?因此,如果流/文件/阅读器/WhateverIoObject超出范围,它将自动关闭?感谢大家的回答和提示!正如下面的一位评论员指出的,这是RTFM或RTFM的问题“你用谷歌搜索过了吗?”后者几乎马上就给出了答案。但据我所知,到目前为止,它在stackoverflow还没有被问到,而额外的好处是把提示放在一边
try ( InputStream inputStream = new ByteArrayInputStream(bytes); Workbook workBook = new XSSFWorkbook(inputStream)) {