ByteArrayInputStream ed=new ByteArrayInputStream(new byte[]{1,2});
InputStream ed1=ed;
DataInputStream ed2=new DataInputStream(ed1);关闭
ed.close();
ed1.close();
ed2.close();
这样才算完全close。
还是只要随便close其中一个就可以了。
这里只是一个例子,比如封装文件流的时候,都一样,怎么关闭处理最重要。
InputStream ed1=ed;
DataInputStream ed2=new DataInputStream(ed1);关闭
ed.close();
ed1.close();
ed2.close();
这样才算完全close。
还是只要随便close其中一个就可以了。
这里只是一个例子,比如封装文件流的时候,都一样,怎么关闭处理最重要。
excutequery.close()执行的动作
connection.close()当前连接
session.close()当前会话
基本上就是这么一个层次关系了
总之,是用小到大一层层关闭的
若不关闭,垃圾回收机制是对没有被引用的对象进行搜集,而且你无法控制它何时进行垃圾清理。
ed1.close();
ed.close();
从内到外关了
感觉这样的习惯最好就跟你用jdbc连数据库似的先关ResultSet,再preparedStatament,再connection一样。
我的封装更单一(就是对一个byte的封装,在或者比如一个文件文件流)
,而jdbc里面,可能存在n个流,也就是rs.close()/io.close()返回的结果集 rs 流封装了a
excutequery.close()执行的动作 excutequery封装的是b
connection.close()当前连接 connection封装的是c
session.close()当前会话 a b c根本不是同一个东西这些流根本就不是分装的同一个东西,所以不能用来说明这个问题。(我没有看过jdbc的源码,也许在现实中 abc 流根本就是一个流。如果他们是一个流就可以说明这个问题)
谢谢
Writer out = new BufferedWriter(new OutputStreamWriter(System.out));
在这种情况下,想要直接调用底层的OutputStreamWriter的close()方法是不可能的。但通过调用out.close()可以确保底层的OutputStreamWriter正确关闭。
http://www.javapractices.com/topic/TopicAction.do?Id=8
> 而不是把FileInputStream 关了剩下的2个过滤流可以不关就这个具体的例子而言,也可以只关闭 FileInputStream,另外两个不去管它。效果基本一样,反正关闭之后你也肯定不会再去操作那两个“尚未关闭的流对象”了。“关闭”真正有意义的事情在于“释放系统资源”。在这个例子里,只有 FileInputStream 占据了系统资源(打开了一个文件),另外两个流对象只是从数据处理角度做的包装(可能会占用一些内存,但不占用其它“系统资源”)。所以,只需要确保关闭了 FileInputStream 即可。在实际编程实践中,你不一定总能清楚地知道每层的流对象是否占据了系统资源,所以,最安全(也是最常规)的做法就是关闭最外层的那个对象。这种逐层包装的对象在实现上都会有一个特点,像“关闭”这种操作都会逐层向内调用。
这篇文章说出了真谛
多谢大家参与 谢谢 结贴