2016-01-22 171 views
0

我目前正在編寫一個程序與使用TCP套接字的服務器通信。其中一部分要求通過多種方法來回發送信息。但是,我不想爲每個請求打開一個新的套接字連接,但我無法保證請求的數量或順序。爲了處理這個問題,我只保留一個重用的套接字實例。關閉BufferedReader而不關閉包裝流

但是,爲了讀取數據,我使用BufferedReader包裝類。因爲我重複使用了相同的套接字,所以我無法在閱讀器上調用close(),或者我也會關閉套接字流。

如果我不想關閉底層流,是否需要在BufferedReader上調用close()?我會因爲不這樣做而導致內存泄漏嗎?如果我確實需要撥打close(),如何在不關閉套接字流的情況下返回內存?

注意:我將在程序終止時關閉底層流,但這個問題不在於此。

+1

爲什麼要爲每個請求打開一個新的套接字連接? – Kayaman

+0

'爲每個請求打開一個新的套接字連接'和'重用相同的套接字'是相互矛盾的。這是什麼?下定決心。那麼關閉緩衝讀寫器有什麼作用? – EJP

+0

哎呀!主要的錯字在那裏。我不想爲每個請求打開一個新的套接字。編輯。 – DonyorM

回答

2

不要關閉BufferedReade更重要的是,不要丟棄BufferedReader;相反,傳遞它而不是SocketInputStream。如其名稱所暗示的那樣,BufferedReader具有內部緩衝區。當您讀取它時,它會嘗試從底層的Reader填充該緩衝區。這意味着,如果你丟棄它,那些字節就消失了。

現在一些沒有提出的建議:

  • 你真的想用一個Reader?大多數通信協議使用DataInputStream/DataOutputStream更好地實現。使用Reader時,僅限於字符數據(並且在BR的情況下是字符數據行)。
  • 你注意編碼嗎?在InputStream上構建Reader的正確方法是使用InputStreamReader的兩個變量變體:new InputStreamReader(in, "UTF-8")(您可以使用UTF-8以外的編碼,但是使用have a good reason)。
  • 通常使用BufferedInputStream而不是BufferedReader更好,因爲從數據流到讀取器的轉換可能涉及多次讀取。如果你想readLine(),你可以隨時使用兩者。
  • 請務必關閉插座,請撥打finally或試用資源。有關更多信息,請參閱this
+0

謝謝這是有幫助的。我有點兒希望有一些沒有提出建議的建議會出現。 :)我已經在使用InputStreamReader,但你說得對,BufferedInputStream可能會更好。我會研究它。 – DonyorM