【问题标题】:Press Enter To Continue - Error: Stream closed [duplicate]按 Enter 继续 - 错误:流已关闭 [重复]
【发布时间】:2019-04-03 12:08:08
【问题描述】:

我写了一个小的 Press Enter to Continue 模块,但 Java 不允许我在读取 BufferedInputStream 后关闭它。如果我关闭它,当我尝试再次调用该模块时,它会报错“流已关闭”,即使我先尝试再次打开它。

import java.io.*;

final public class PressEnter {
    public static void toContinue() {
        try {
            BufferedInputStream buff=new BufferedInputStream(System.in);
            int in=buff.read();
            buff.close();
        }
        catch (IOException e) { System.out.println("Error: "+e.getMessage()); }
    }
}

我没有关闭 BufferedInputStream 并且它工作正常,我调用它的次数也是如此。留在 buff.close 中会出错。

public class TestPressEnter {
    public static void main(String[] args) {
        System.out.print("Press Enter To Continue...");
        PressEnter.toContinue();
        System.out.println("Continuing...");

        System.out.print("Press Enter To Continue Again...");
        PressEnter.toContinue();
        System.out.println("Continuing...");
    }
}

【问题讨论】:

  • 删除buff.close();。你正在关闭System.in。
  • 问题是BufferedInputStream.close() 也会关闭传递的流(在您的情况下为System.in),这是您不希望发生的事情。

标签: java


【解决方案1】:

即使重新实例化已关闭的扫描程序,也无法重新打开它。见Why is not possible to reopen a closed (standard) stream?

BufferedInputStream 是底层 InputStream 的包装器,在本例中为 System.in。所以在包装器上调用 close 也会关闭底层流。

您应该将Scanner 从方法调用中实例化出来,而不是在那里使用它来读取它。您可以创建一个新方法,在您读完 main 方法后将其关闭。

【讨论】:

    【解决方案2】:

    OutputStream的关闭总合约:

    public void close() throws IOException 关闭此输出流并 释放与此流相关的任何系统资源。这 关闭的一般合同是它关闭输出流。一种 关闭的流不能执行输出操作,不能 重新打开。

    PrintStream 的

    public void close()关闭流。这是通过冲洗 流,然后关闭底层输出流。

    我能给你的唯一建议是你不应该编写不对称的代码,也就是说,不要将你的代码创建的资源的关闭委托给其他地方。

    即使在您的情况下关闭包装流似乎是明智的,但事实是您不应该这样做,因为您正在关闭在其他地方打开的流。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-10-28
      • 1970-01-01
      • 2010-11-27
      • 2023-03-22
      • 1970-01-01
      • 1970-01-01
      • 2014-05-01
      相关资源
      最近更新 更多