2012-01-17 55 views
18

有人可以解釋以下行爲的Java插座:行爲的Java插座時,請關閉輸出流

的總體思路是這樣的:

  1. 打開插座,獲得I/O流。
  2. 寫請求,收出流
  3. 讀取響應,在流
  4. 關閉插座關閉。

這是我的問題。

如果我使用PrintWriter進行輸出,然後關閉它,它會關閉整個套接字,並且隨後的讀取操作會失敗。

相反,如果我直接使用套接字的shutdownOutput()方法,它會正確關閉輸出流通道,同時保持套接字活動。

爲什麼要關閉PrintWriter對象將整個套接字放在一起呢?

+1

也許你需要在關閉之前刷新它。 – 2012-01-17 05:59:05

+1

你試圖關閉您的PrintWriter,看看問題是否犯規發生之前,您連接.flush()沖洗? – vcetinick 2012-01-17 05:59:26

回答

26

這可能是你的代碼是什麼樣子:

Socket socket; 
PrintWriter pw = new PrintWriter(socket.getOutputStream()); 
pw.close(); 

現在,讓我們來看看的Socket getOutputStream()方法的說明。

getOutputStream

public OutputStream getOutputStream() throws IOException

返回此套接字的輸出流。 如果此套接字具有關聯的通道,則生成的輸出流會將其所有操作委託給該通道。如果通道處於非阻塞模式,則輸出流的寫入操作將拋出一個IllegalBlockingModeException

關閉返回的OutputStream將關閉關聯的套接字。

返回:

的字節寫入此套接字的輸出流。

拋出:

IOException - 如果創建輸出流或如果套接字未連接時發生I/O錯誤。

從上面的描述中,我們知道關閉返回的OutputStream會關閉相關的套接字。

現在,當你關閉PrintWriter,它會關閉相關OutputStream將關閉關聯套接字。

+4

RTFM eh? :) 我想這可以徹底解釋它。謝謝血狼! – 2012-01-17 14:49:26

+0

@Alanmars如何避免這種情況。如果我想在關閉OutputStream後仍保持打開狀態,該怎麼辦?有沒有辦法做到這一點? – 2016-06-13 10:08:21

2

這可能是因爲調用的PrintWriterclose()方法追溯通過等級和調用SocketOutputStreamclose()方法爲好。作爲SocketOutputStreamclose()方法的一部分,它也調用Socketclose()方法,這也將在短期內關閉SocketInputStream。調用shutdownOutput()函數會發送之前寫入的數據,然後是TCP的正常連接終止序列。然後禁用輸出流。