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