精彩文章免费看

java中这些Stream流不需要关闭,你知道几个

更多文章请关注公号(ID:CodeReading)

曾几何时,作为java程序员要记住的一条 IO 准则是,流用完了一定要在关闭,一定要写在 finally 里。

finally {
    out.flush();
    out.close();

但有些Stream是不需要关闭的。比如ByteArrayOutputStream,当然还有它的妹妹ByteArrayInputStream和表哥StringWriter。道理一样,我们就不讨论亲戚们了。
作为一种OutputStream它也extendsOutputStream,自然也有实现了flush()close()
但这2个方法的方法体为空。

* Closing a <tt>ByteArrayOutputStream</tt> has no effect. The methods in * this class can be called after the stream has been closed without * generating an <tt>IOException</tt>. public void close() throws IOException { * OutputStream的方法,ByteArrayInputStream并未重写 public void flush() throws IOException {

看源码不难发现。ByteArrayInputStream内部实现的是一个byte[]数组,也就是基于内存的字节数据访问。并没有占用硬盘,网络等资源。就算是不关闭,用完之后垃圾回收器也会回收掉。这点跟普通数组并没有区别。既然是操作内存,就要考虑到内存大小,如果字节流太大,要考虑内存溢出的情况。

但是,作为一名蛋疼的程序员,习惯性关闭流是一个很流比的习惯,不管三七五十八,先close掉再说,现在close()是空方法,保不齐哪天就有实现了呢?这也是百利无一害的事,就好像保健品,吃了不治病,但一般也吃不坏。

  • 结论就是:指向内存的流可以不用关闭,指向硬盘/网络等外部资源的流一定要关闭。
  • 最后编辑于:2021-01-24 23:11