为什么我不能在java中打开第二个流?

时间:2018-04-10 08:12:45

标签: java stream

这是我的问题。我已经制作了简单的输入类,其中包含从用户键盘中获取原始值的方法。问题是每当我在其他类中使用此类时,我面临的问题是我做了这个课程的多个实例,我得到了关于"关闭流的问题"。为什么会发生这种情况?

例如:我有一个主要的方法,我得到用户的输入并决定要制作哪个对象,比如我可以制作4个不同的对象(4个类),在我调用对象"设置状态& #34;方法,其中我实际设置此对象的所有状态与输入类的第二个实例,然后,当我尝试再次读取我的主方法中的用户输入时,我得到一个异常"溪流关闭"。 以下是输入类的代码:

public class UserInput {
  BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));;

  public int getInt() {
    try {
      String line;
      line = reader.readLine();
      return Integer.parseInt(line);
    } catch (Exception ex) {
      ex.printStackTrace();
      return -1;
    }
  }

  public double getDouble() {
    try {
      String line = reader.readLine();
      return Double.parseDouble(line);
    } catch (Exception ex) {
      return -1;
    }
  }

  public float getFloat() {
    try {
      String line = reader.readLine();
      return Float.parseFloat(line);
    } catch (Exception ex) {
      return -1;
    }
  }

  public long getLong() {
    try {
      String line = reader.readLine();
      return Long.parseLong(line);
    } catch (Exception ex) {
      return -1;
    }
  }

  public short getShort() {
    try {
      String line = reader.readLine();
      return Short.parseShort(line);
    } catch (Exception ex) {
      return -1;
    }
  }

  public String getString() {
    try {
      String line = reader.readLine();
      return line;
    } catch (Exception ex) {
      return " ";
    }
  }

  public char getChar() {
    try {
      return (char) reader.read();
    } catch (Exception ex) {
      return (' ');
    }
  }

  public void close() {
    if (reader != null) {
      try {
        reader.close();
      } catch (IOException e) {
        e.printStackTrace();
      }
    }
  }
}

2 个答案:

答案 0 :(得分:0)

用户输入的标准方法是使用已包含读取不同类型输入的方法的Scanner

你不应该关闭reader,因为这会关闭System.in,这不是你想要的。

答案 1 :(得分:0)

通过调用reader.close();,您不仅自己关闭了读者,因为调用会调用close()的{​​{1}}方法,因此关闭InputStreamReader(您不能重新打开)。

一个可能的解决方案是使用System.in作为Kayaman在his answer中指出的,或者像这样覆盖Scanner方法:

close()