[英]Closing BufferedReader without closing wrapped stream
我目前正在编写一个使用TCP套接字与服务器通信的程序。 其中一部分需要通过几种方法来回发送信息。 但是,我不想为每个请求打开一个新的套接字连接,但是我不能保证请求的数量或顺序。 为了解决这个问题,我只保留了一个可以大量重用的套接字实例。
但是,为了读取数据,我使用BufferedReader
包装器类。 因为我重用了相同的套接字,所以无法在读取器上调用close()
,否则我也将关闭套接字流。
如果我不想关闭基础流,是否需要在BufferedReader上调用close()
? 不这样做会导致内存泄漏吗? 如果确实需要调用close()
如何在不关闭套接字流的情况下返回内存?
注意:我将在程序终止时关闭基础流,这个问题与之无关。
不要关闭BufferedReade
。 更重要的是 ,不要丢弃BufferedReader
; 而是传递它,而不是SocketInputStream
。
顾名思义, BufferedReader
具有内部缓冲区。 从中读取时,它会尝试从基础Reader
填充该缓冲区。 这意味着,如果丢弃它,这些字节将丢失。
现在有一些未提出的建议:
Reader
吗? 使用DataInputStream
/ DataOutputStream
可以更好地实现大多数通信协议。 使用Reader
您只能使用字符数据(对于BR
,是字符数据行)。 Reader
上的顶部InputStream
是使用两个参数的变异体InputStreamReader
: new InputStreamReader(in, "UTF-8")
您可使用UTF-8编码,但有一个良好的原因 )。 BufferedInputStream
而不是BufferedReader
,因为从流到阅读器的转换可能涉及多次读取。 如果需要readLine()
,则可以始终使用两者。 finally
或try-with-resources中关闭套接字 。 请参阅此以获取更多信息。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.