作者kikiapple (KiKi苹果)
看板java
标题[问题] I/O close 的问题
时间Sun Oct 11 20:58:09 2009
像这样子重复包起来的 io stream:
Socket s = new Socket(domain, port);
InputStream a = s.getInputStream();
InputStreamReader b = new InputStreamReader(a);
BufferedReader c = new BufferedReader(b);
是需要全部依序 close
c.close();
b.close();
a.close();
s.close();
还是只需要
c.close();
s.close();
我以为得依序close,但是书上的范例是後者。
两种方法执行都不会产生问题,但是自我感觉不太良好。
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 220.133.0.171
1F:推 slalala:要不要补一段 当c close之後 a与b是否 closed? 10/11 21:01
Yes, they are closed.
s.isClosed(); // returns false
c.close();
s.isClosed(); // returns true
char[] bc = new char[2048];
b.read(bc); // 产生 java.io.IOException: Stream closed
byte[] bb = new byte[2048];
a.read(bb); // 产生 nulljava.net.SocketException: socket closed
这种自动 close 上层串流是程式设计师之间的惯例吗?
如果自动 close 是惯例,为何范例仍加上 s.close(); ?
※ 编辑: kikiapple 来自: 220.133.0.171 (10/11 22:04)
2F:推 PsMonkey:不是设计师之间的惯例,是 class 设计的想法吧? 10/11 22:06
3F:推 slalala:以资料库连线比较好懂 没close就一个使用者卡在那边 10/11 22:08
4F:→ kikiapple:可以理解是要确保串流有关闭,可是书上的例子让我迷惑了 10/11 22:17
5F:→ kikiapple:要不就四个都close,却只close c跟s? 10/11 22:19
6F:推 svenlee:你可以去看看Socket.close()的原始码发生了什麽事 10/15 22:29