我目前正在编写一个使用 TCP 套接字与服务器通信的程序。其中一部分需要通过多种方法来回发送信息。但是,我不想为每个请求打开新的套接字连接,但我无法保证请求的数量或顺序。为了解决这个问题,我只是保留一个经常重用的套接字实例。
但是,为了读取数据,我使用BufferedReader
包装类。因为我重复使用同一个套接字,所以我无法在读取器上调用close()
,或者我也会关闭套接字流。
如果我不想关闭基础流,是否需要在缓冲读取器上调用close()
?不这样做会导致内存泄漏吗?如果我确实需要调用close()
如何在不关闭套接字流的情况下返回内存?
注意:我将在程序终止时关闭底层流,这个问题与此无关。
不要关闭BufferedReade
。更重要的是,不要丢弃BufferedReader
;相反,传递它而不是SocketInputStream
。
顾名思义,BufferedReader
具有内部缓冲区。当您从中读取时,它会尝试从底层Reader
填充该缓冲区。这意味着,如果你丢弃它,这些字节就会消失。
现在还有一些不请自来的建议:
- 你真的想使用
Reader
吗?大多数通信协议最好使用DataInputStream
/DataOutputStream
.使用Reader
,您仅限于字符数据(如果是BR
,则为字符数据行)。 - 你注意编码吗?在
InputStream
之上构造Reader
的正确方法是使用InputStreamReader
的双参数变体:new InputStreamReader(in, "UTF-8")
(您可以使用 UTF-8 以外的编码,但有充分的理由)。 - 通常最好使用
BufferedInputStream
而不是BufferedReader
,因为从流到阅读器的翻译可能涉及多次读取。如果你想要readLine()
,你总是可以同时使用两者。 - 请务必关闭
finally
或试用资源中的套接字。有关详细信息,请参阅此处。