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)) {