java - 关闭 BufferedReader 而不关闭包装流

标签 java sockets memory-leaks stream

我目前正在编写一个使用 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/

相关文章:

c - TCP套接字编程错误

javascript - Jquery/Javascript 内存泄漏

c++ - 使用 CComVariant 时出现 Outlook 插件内存泄漏

javascript - 清空 innerHTML 会增加 DOM 节点的数量

sockets - 如何在 Rust 中关闭 Unix 套接字?

java - DAO 需要单独的接口(interface)和实现

java - 使用mockito在TestFx中模拟FileChooser

java - 使用 JRE 1.8 或更高版本运行 Android Studio

sockets - Flink 可以接收 http 请求作为数据源吗?

java - 如何将多个组件添加到 JFrame