java - 我是否需要关闭 PipedInputStream 和 PipedOutputStream

标签 java inputstream outputstream

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

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

最佳答案

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

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


关于 other answer :

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

  • 他是正确的,任何同时打开大量(他说“数百”)资源的东西(守护线程或其他)都是一个坏主意。

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

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


1 - 应用程序可能会收到“kill -9”,这将导致它立即退出, 不会运行关闭 Hook 。应用程序可能会在关键更新过程中出现“文件系统已满”。电源可能会关闭。等等……

关于java - 我是否需要关闭 PipedInputStream 和 PipedOutputStream,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44223378/

相关文章:

java - 以编程方式在分屏中打开应用程序

java - 应用程序运行尝试连接到 Azure Database for MySql Server 失败

java - 获取特定 JTable 单元格中的前景(字体)

java - 如何在另外两种类型的 Streams 中使用 Socket 流 - Java

java - 我们如何测试一个类是否实现了很多接口(interface)?

java - 使用输入流从 XML 文件读取属性?

java - 在 JCR 2 中将 inputStream 读入节点属性的正确方法是什么?

c++ - 我们如何在 C++ 中一次从 STDIN 扫描 100 个字节

java - 如何在 Java 中通过 http 将一些文本附加到远程 txt 文件?

java - Spring:已经为此响应调用了 getOutputStream()