BufferedReader返回null第二次使用

时间:2013-10-25 16:27:16

标签: java file-io

我正在使用此自定义类在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();
    }
}

2 个答案:

答案 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();
        ...

根据需要添加异常处理代码。您无需关闭阅读器。