Linux上的java - 必须按两次CtrlD

时间:2014-03-10 21:54:33

标签: java linux

String str = "";
BufferedReader bfr = new BufferedReader(new InputStreamReader(System.in));
int tempint = 0;
try {
    //The program cannot get out from this while loop!
    while((tempint = bfr.read()) != -1){
        str += Character.toString((char)tempint);
    }
}
catch(IOException ioe) {
    System.out.println(ioe);
}
//Print the input
System.out.println(str);

这是我为从标准输入读取用户输入而编写的代码。这段代码被提取为playinput.jar 我写了一个脚本play来运行这个jar。但是当我在终端(linux)中运行./play并完成我的输入(不包含输入)之后,我必须按Ctrl+D两次才能打印输入。

当我运行另一个名为check的脚本时会出现同样的问题,该脚本只会调用./play并通过stdin发送一些输入。在我运行./check后,它只是挂在那里,输入无法打印出来。

有人可以帮忙解决这个问题吗?谢谢:))

1 个答案:

答案 0 :(得分:2)

这就是Linux终端的工作原理。它与您的Java代码无关。

如果使用cat > textfile之类的命令对其进行测试,您会发现,除非您位于一行的开头,否则^D不会立即结束该文件。 (我不知道这种行为的所有细节,但这是它的要点。)

Linux的惯例是文本文件始终以换行符结尾。如果你不遵守惯例,你可能会遇到这样的问题。

但是,当您使用重定向发送数据时,我不确定程序挂起的问题。这部分对我来说更令人惊讶,因为它不是交互式的,因此终端行为不应成为问题。