繁体   English   中英

关闭BufferedReader而不关闭包装的流

[英]Closing BufferedReader without closing wrapped stream

我目前正在编写一个使用TCP套接字与服务器通信的程序。 其中一部分需要通过几种方法来回发送信息。 但是,我不想为每个请求打开一个新的套接字连接,但是我不能保证请求的数量或顺序。 为了解决这个问题,我只保留了一个可以大量重用的套接字实例。

但是,为了读取数据,我使用BufferedReader包装器类。 因为我重用了相同的套接字,所以无法在读取器上调用close() ,否则我也将关闭套接字流。

如果我不想关闭基础流,是否需要在BufferedReader上调用close() 不这样做会导致内存泄漏吗? 如果确实需要调用close()如何在不关闭套接字流的情况下返回内存?

注意:我将在程序终止时关闭基础流,这个问题与之无关。

不要关闭BufferedReade 更重要的是 ,不要丢弃BufferedReader ; 而是传递它,而不是SocketInputStream

顾名思义, BufferedReader具有内部缓冲区。 从中读取时,它会尝试从基础Reader填充该缓冲区。 这意味着,如果丢弃它,这些字节将丢失。

现在有一些未提出的建议:

  • 您真的要使用Reader吗? 使用DataInputStream / DataOutputStream可以更好地实现大多数通信协议。 使用Reader您只能使用字符数据(对于BR ,是字符数据行)。
  • 您是否在注意编码? 构建一个正确的方法Reader上的顶部InputStream是使用两个参数的变异体InputStreamReadernew InputStreamReader(in, "UTF-8")您可使用UTF-8编码,但有一个良好的原因 )。
  • 通常最好使用BufferedInputStream而不是BufferedReader ,因为从流到阅读器的转换可能涉及多次读取。 如果需要readLine() ,则可以始终使用两者。
  • 确保在finally或try-with-resources中关闭套接字 请参阅以获取更多信息。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM