【问题标题】:Why do I need to close streams为什么我需要关闭流
【发布时间】:2016-02-05 09:25:45
【问题描述】:

为什么我需要关闭 Streams(FileInputStream 等)? 如果我没有关闭流,Java是否不智能使用GC?

public void getLongStrings() throws IOException {
        InputStream i1 = null;
        InputStream i2 = null;
        InputStreamReader isr1 = null;
        InputStreamReader isr2 = null;
        try {
            i1 = aBook.getInputStream();
            i2 = aNovel.getInputStream();
            isr1 = new InputStreamReader(i1);
            isr2 = new InputStreamReader(i2);
            foo = FileCopyUtils.copyToString(isr1);
            bar = FileCopyUtils.copyToString(isr2);
        }
        catch (IOException ioe) {
            //do something appropriate here
        } finally {
            if (i1 != null) i1.close();
            if (i2 != null) i2.close();
            if (isr1 != null) isr1.close();
            if (isr2 != null) isr2.close();
        }
    }

我需要关闭我使用的所有流吗?

【问题讨论】:

  • 是的,您需要关闭流,因为流已经充满了内容,当您关闭流时,您可以再次使用它。使用刷新方法时,驱动器中的数据也会刷新。当您关闭流时,JVM 会看到该流不可用于进一步操作。
  • Closing Streams in Java的可能重复
  • 当我离开你家时,我应该关上门,还是假设你会走到我身后处理它?
  • 您应该查看 try-with-resources 是否是您所针对的代码量。
  • JVM 内存不足时触发垃圾收集,而不是文件描述符不足时触发。因此,当您需要它们时,依靠垃圾收集为您清理可能无法为您留下足够的描述符。

标签: java stream fileinputstream


【解决方案1】:

垃圾收集器旨在收集未使用的对象。 流通常链接到许多资源(文件描述符、套接字等),这些资源在您的机器中更为重要。当然,它们可能会在程序退出时被释放,但它们应该尽可能少地保持打开状态

【讨论】:

    【解决方案2】:

    这称为显式终止,它手动终结分配资源的对象,而不是使用终结器方法。我在这里引用 Joshua Bloch 的 Effective Java:

    那么你应该怎么做而不是为一个类写一个终结器 对象封装需要终止的资源,例如文件 或线程?只需提供一个明确的终止方法,并要求 类的客户端在每个实例上调用此方法 不再需要。值得一提的一个细节是实例 必须跟踪它是否已被终止:显式 终止方法必须记录对象所在的私有字段 不再有效,其他方法必须检查该字段并抛出 IllegalStateException 如果它们在对象被调用后被调用 终止。显式终止方法的典型示例是 InputStream、OutputStream 和 java.sql.Connection 上的 close 方法。 另一个例子是java.util.Timer上的cancel方法,

    【讨论】:

      猜你喜欢
      • 2015-04-16
      • 2011-05-27
      • 1970-01-01
      • 1970-01-01
      • 2020-08-28
      • 1970-01-01
      • 1970-01-01
      • 2012-08-26
      • 2014-09-24
      相关资源
      最近更新 更多