我正在使用此自定义类在eclipse中调试时模拟system.console
。
令我困惑的是reader = new BufferedReader(new InputStreamReader(
System.in));
在第二次调用readLine
后返回null。
我认为这是因为我关闭了System.in,但根据oracle
InputStream的close方法不执行任何操作。
所以现在我很难过。这是代码:
public class CustomConsole {
public String readLine(String format, Object... args) {
if (System.console() != null) {
return System.console().readLine(format, args);
}
BufferedReader reader = null;
String line = null;
try {
System.out.print(String.format(format, args));
reader = new BufferedReader(new InputStreamReader(
System.in));
line = reader.readLine();
} catch (IOException e) {
Logger.fatal(e.getMessage());
System.exit(-1);
} finally {
if (reader != null) {
try {
reader.close();
} catch (IOException e) {
Logger.error("CustomConsole.readLine(): BufferedReader could not be closed");
e.printStackTrace();
}
} else {
Logger.error("CustomConsole.readLine(): BufferedReader is null");
}
}
return line;
}
public String readLine() {
return readLine("", "");
}
public char[] readPassword(String format, Object... args) {
if (System.console() != null) return System.console().readPassword(format, args);
return this.readLine(format, args).toCharArray();
}
}
答案 0 :(得分:2)
close
的{{1}}方法什么都不做,但InputStream
可以是子类,这个子类可以实现InputStream
。例如close
就是这种情况,在我的机器上是BufferedInputStream
的类型。
当您关闭阅读器时,您将关闭所有基础资源,从而关闭System.in
。之后什么都不能读。
要解决此问题,您只需删除完全关闭阅读器的代码即可。每次重新创建BufferedReader似乎都很奇怪,然后将其存储为System.in
的字段并在下次重用它。无论如何,你不需要关闭它,因为它只是System.in包装器的包装器,由系统处理。
以这种精神重写你的课将产生这样的东西:
CustomConsole
答案 1 :(得分:0)
InputStream是一个抽象类。 System.in将为您提供InputStream的子类的对象,该对象可能以不同的方式实现close方法。
如何修改类以使字段保存您创建的BufferedReader?像这样:
public class CustomConsole {
private BufferedReader reader;
public String readLine(String format, Object... args) {
if (System.console() != null) {
return System.console().readLine(format, args);
} else if (reader == null) {
reader = new BufferedReader(new InputStreamReader(
System.in));
}
return reader.readLine();
...
根据需要添加异常处理代码。您无需关闭阅读器。