关闭缓冲读取器而不关闭包装的流



我目前正在编写一个使用 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或试用资源中的套接字。有关详细信息,请参阅此处。

相关内容

  • 没有找到相关文章

最新更新