【问题标题】:Do I need to close PipedInputStream and PipedOutputStream我需要关闭 PipedInputStream 和 PipedOutputStream
【发布时间】:2017-10-28 15:13:56
【问题描述】:

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

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

【问题讨论】:

  • 你应该关闭任何可以关闭的东西。
  • @EJP 我问这个问题的原因是因为我不知道该怎么做。我不相信守护线程已经定义了关闭行为?我认为您可以添加关闭挂钩,但如果这很重要,我觉得它会被加入。

标签: java inputstream outputstream


【解决方案1】:

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

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


关于other answer

看了Answer和cmets后,我认为他的论点过于笼统了:

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

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

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


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

【讨论】:

    猜你喜欢
    • 2023-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-18
    • 1970-01-01
    • 2018-10-06
    • 1970-01-01
    • 2014-07-21
    相关资源
    最近更新 更多