[問題] I/O close 的問題

看板java作者 (KiKi蘋果)時間14年前 (2009/10/11 20:58), 編輯推噓4(402)
留言6則, 4人參與, 最新討論串1/2 (看更多)
像這樣子重複包起來的 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

10/11 21:01, , 1F
要不要補一段 當c close之後 a與b是否 closed?
10/11 21:01, 1F
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)

10/11 22:06, , 2F
不是設計師之間的慣例,是 class 設計的想法吧?
10/11 22:06, 2F

10/11 22:08, , 3F
以資料庫連線比較好懂 沒close就一個使用者卡在那邊
10/11 22:08, 3F

10/11 22:17, , 4F
可以理解是要確保串流有關閉,可是書上的例子讓我迷惑了
10/11 22:17, 4F

10/11 22:19, , 5F
要不就四個都close,卻只close c跟s?
10/11 22:19, 5F

10/15 22:29, , 6F
你可以去看看Socket.close()的原始碼發生了什麼事
10/15 22:29, 6F
文章代碼(AID): #1AqTPYjE (java)
文章代碼(AID): #1AqTPYjE (java)