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
后,它只是挂在那里,输入无法打印出来。
有人可以帮忙解决这个问题吗?谢谢:))
答案 0 :(得分:2)
这就是Linux终端的工作原理。它与您的Java代码无关。
如果使用cat > textfile
之类的命令对其进行测试,您会发现,除非您位于一行的开头,否则^D
不会立即结束该文件。 (我不知道这种行为的所有细节,但这是它的要点。)
Linux的惯例是文本文件始终以换行符结尾。如果你不遵守惯例,你可能会遇到这样的问题。
但是,当您使用重定向发送数据时,我不确定程序挂起的问题。这部分对我来说更令人惊讶,因为它不是交互式的,因此终端行为不应成为问题。