作者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