我是否需要关闭 PipedInputStream 和 PipedOutputStream

Do I need to close PipedInputStream and PipedOutputStream

我正在编写一个简单的 Swing GUI,其中包括一个打印调试消息和异常的文本字段。我目前在写入 PipedOutputStream 的地方设置了它,并且我有一个守护线程,它从连接的 PipedInputStream 读取并写入文本区域。

当我试图弄清楚如何关闭我的守护线程中的流时,我遇到了 another answer,它说守护线程不应持有任何资源。管道流计数吗?他们需要关闭吗?

A PipedInputStream / PipedOutputStream 不持有任何 操作系统 资源。所以任何说守护线程不应该持有资源的建议在这里都不适用。 (但见下文!)

然而,这并不意味着您永远 不需要close()(至少)PipedOutputStream。根据您的应用程序,相应的 PipedInputStream 可能 需要关闭管道才能完成其工作。


关于 other answer:

看了答案和评论后,我认为他的论点过于笼统:

  • 他是对的,任何同时打开大量(他说 "hundreds")资源的东西(守护线程或其他东西)都是一个坏主意。

  • 他说在守护线程中执行 关键 文件更新是有风险的,这也是正确的。但是在 Java 中的 any 线程中执行 critical 文件更新具有相同的风险 1。或者在 C 中。您只需要将更新序列设计为故障安全的...或者依靠诸如数据库事务之类的东西来实现故障安全。

但是,将其概括为说守护线程不应该持有资源在逻辑上是不合理的(或在实用上是不明智的)。显然存在上述问题不适用的用例。


1 - 应用程序可能会得到一个 "kill -9",这将导致它在没有 运行 关闭挂钩的情况下立即退出。应用程序可能会在关键更新过程中获得 "file system full"。电源可能会关闭。等等...