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