3

我正在尝试使用 BufferedReader 从输入中读取 a。它第一次运行,但第二次运行时出现异常。

john@fekete:~/devel/java/pricecalc$ java frontend.CUI 
> gsdfgd
Invalid command!
> I/O Error getting string:  java.io.IOException: Stream closed
I/O Error: java.io.IOException: java.io.IOException: Stream closed
> I/O Error getting string:  java.io.IOException: Stream closed
I/O Error: java.io.IOException: java.io.IOException: Stream closed
> I/O Error getting string:  java.io.IOException: Stream closed

它只是循环运行。我肯定错过了什么。

public static void main(String args[]) {
            if (args.length == 0) {
                    while (!exit) {
                            try {
                                    exit = processLine(commandLine());
                            } catch (IOException e) {
                                    System.out.println("I/O Error: " + e);
                            }
                    }
                    System.out.println("Bye!");
            } else if (args.length == 1) {
                    String line = new String(args[0]);
                    processLine(line);
            } else {
                    String line = new String(args[0]);
                    for (String np : args) {
                            line = new String(line + " " + np); 
                    }
                    processLine(line);
            }
    }

    static private String commandLine() throws IOException {
            String str = new String();
            try (BufferedReader br = new BufferedReader(new InputStreamReader(System.in))) {
                    System.out.print("> ");
                    str = new String(br.readLine());
                    str = str.trim();
            } catch (IOException e) {
                    System.out.println("I/O Error getting string: "+ str + " " + e);
                    throw new IOException(e);
            }

            return str;
    }

这一切似乎都是关于 commandLine() 不起作用,所以我刚刚包含了它和 main。

4

1 回答 1

12

是的,你在这里关闭流:

try (BufferedReader br = new BufferedReader(new InputStreamReader(System.in)))

该 try-with-resources 语句将关闭BufferedReader块末尾的 ,这将关闭InputStreamReader,这将关闭System.in

在这种情况下你不想这样做,所以只需使用:

// Deliberately not closing System.in!
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));   
try {
    ...
}

尽管如此,这仍然可能不会完全按照您的意愿行事,因为这BufferedReader可能会消耗(和缓冲)更多数据。您最好创建BufferedReader 一次(在调用代码中)并将其传递给方法。

哦,我建议你摆脱这个:

String str = new String();

根本没有必要。这会更好:

String str = "";

但即便如此,这也是一项毫无意义的任务。同样,您不需要从readLine(). 只需使用:

return br.readLine().trim();

...在try街区内。str此外,在块内记录没有意义catch,因为它将为空 -IOException只有在读取行时才会抛出......

于 2013-06-18T17:04:13.333 回答