java流怎么close最合适

wwwhl668899 2008-09-29 08:57:07
ByteArrayInputStream ed=new ByteArrayInputStream(new byte[]{1,2});
InputStream ed1=ed;
DataInputStream ed2=new DataInputStream(ed1);

关闭
ed.close();
ed1.close();
ed2.close();
这样才算完全close。
还是只要随便close其中一个就可以了。
这里只是一个例子,比如封装文件流的时候,都一样,怎么关闭处理最重要。
...全文
378 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
wwwhl668899 2008-10-01
  • 打赏
  • 举报
回复
http://topic.csdn.net/u/20070405/22/8575ad41-2727-46bc-98dc-4df396797827.html

> 就是不明白 怎么是把DataInputStream 关了另外2个可以不关,
> 而不是把FileInputStream 关了剩下的2个过滤流可以不关

就这个具体的例子而言,也可以只关闭 FileInputStream,另外两个不去管它。效果基本一样,反正关闭之后你也肯定不会再去操作那两个“尚未关闭的流对象”了。

“关闭”真正有意义的事情在于“释放系统资源”。在这个例子里,只有 FileInputStream 占据了系统资源(打开了一个文件),另外两个流对象只是从数据处理角度做的包装(可能会占用一些内存,但不占用其它“系统资源”)。所以,只需要确保关闭了 FileInputStream 即可。

在实际编程实践中,你不一定总能清楚地知道每层的流对象是否占据了系统资源,所以,最安全(也是最常规)的做法就是关闭最外层的那个对象。这种逐层包装的对象在实现上都会有一个特点,像“关闭”这种操作都会逐层向内调用。
这篇文章说出了真谛


多谢大家参与 谢谢 结贴
cn328 2008-09-30
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 wwwhl668899 的回复:]
首先谢谢大家的回答

第一 大家都同意要关闭所有的流
第二 是从内到外的关闭方式

如果同意结贴了
[/Quote]
同意
ThirstyCrow 2008-09-30
  • 打赏
  • 举报
回复
只要关闭最外层的流就可以了。正因为如此,你经常可以在Java IO API中看到类似于这样的写法:
Writer out = new BufferedWriter(new OutputStreamWriter(System.out));

在这种情况下,想要直接调用底层的OutputStreamWriter的close()方法是不可能的。但通过调用out.close()可以确保底层的OutputStreamWriter正确关闭。
http://www.javapractices.com/topic/TopicAction.do?Id=8
xuhs 2008-09-30
  • 打赏
  • 举报
回复
其实和数据库的jdbc连接关闭差不多了,由小到大,逐步释放资源,就是采取先开后关的策略
ansj 2008-09-30
  • 打赏
  • 举报
回复
关闭顺序对了..还有你最好写再try里面关闭
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 da_en 的回复:]
ed2.close();
ed1.close();
ed.close();
从内到外关了
感觉这样的习惯最好

就跟你用jdbc连数据库似的先关ResultSet,再preparedStatament,再connection一样。
[/Quote]
顶一个……
machao299 2008-09-30
  • 打赏
  • 举报
回复
老师说过:正着开 倒着关。 平时只关闭连接就可以了。除非准求完美。不碍事的。
wwwhl668899 2008-09-29
  • 打赏
  • 举报
回复
还有就是我所说的流 和jdbc的流的 好像不同,
我的封装更单一(就是对一个byte的封装,在或者比如一个文件文件流)
,而jdbc里面,可能存在n个流,也就是

rs.close()/io.close()返回的结果集 rs 流封装了a
excutequery.close()执行的动作 excutequery封装的是b
connection.close()当前连接 connection封装的是c
session.close()当前会话

a b c根本不是同一个东西

这些流根本就不是分装的同一个东西,所以不能用来说明这个问题。

(我没有看过jdbc的源码,也许在现实中 abc 流根本就是一个流。如果他们是一个流就可以说明这个问题)
谢谢
wwwhl668899 2008-09-29
  • 打赏
  • 举报
回复
首先谢谢大家的回答

第一 大家都同意要关闭所有的流
第二 是从内到外的关闭方式

如果同意结贴了
tianqiao1689 2008-09-29
  • 打赏
  • 举报
回复
通常的关闭是有顺序的,一般是先开后关
huoyin 2008-09-29
  • 打赏
  • 举报
回复
最后建立的流,应当最先被close,最先建立的流最后close。每个都close一下,因为每个对象中都有可能有自己占用的资源,不仅是文件描述符。
zjx2388 2008-09-29
  • 打赏
  • 举报
回复
关闭的顺序是先开后关
  • 打赏
  • 举报
回复
关于关闭顺序,从里到外是一般的关闭顺序
da_en 2008-09-29
  • 打赏
  • 举报
回复
ed2.close();
ed1.close();
ed.close();
从内到外关了
感觉这样的习惯最好

就跟你用jdbc连数据库似的先关ResultSet,再preparedStatament,再connection一样。
  • 打赏
  • 举报
回复
最好都close这样释放他们占用的资源
若不关闭,垃圾回收机制是对没有被引用的对象进行搜集,而且你无法控制它何时进行垃圾清理。
zx273064010 2008-09-29
  • 打赏
  • 举报
回复
学习
yami251139 2008-09-29
  • 打赏
  • 举报
回复
如果没用到可以跳过。。。
yami251139 2008-09-29
  • 打赏
  • 举报
回复
rs.close()/io.close()返回的结果集
excutequery.close()执行的动作
connection.close()当前连接
session.close()当前会话
基本上就是这么一个层次关系了
总之,是用小到大一层层关闭的











62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧