linux上的java-必须按CtrlD两次
这是我为从标准输入读取用户输入而编写的代码。这段代码被提取为linux上的java-必须按CtrlD两次,java,linux,Java,Linux,这是我为从标准输入读取用户输入而编写的代码。这段代码被提取为playinport.jar 我已经编写了一个脚本play来运行这个jar。但是,在终端(linux)中运行/play并完成不包含enter的输入后,我必须按两次Ctrl+D,才能将输入打印出来 当我运行另一个名为check的脚本时,也出现了同样的问题,该脚本只需调用/play,并通过stdin发送一些输入。在我运行/check之后,它就挂在那里,无法打印输入 有人能帮忙解决这个问题吗?谢谢:)这就是Linux终端的工作原理。它与Jav
playinport.jar
我已经编写了一个脚本play
来运行这个jar。但是,在终端(linux)中运行/play
并完成不包含enter的输入后,我必须按两次Ctrl+D
,才能将输入打印出来
当我运行另一个名为check
的脚本时,也出现了同样的问题,该脚本只需调用/play
,并通过stdin
发送一些输入。在我运行/check
之后,它就挂在那里,无法打印输入
有人能帮忙解决这个问题吗?谢谢:)这就是Linux终端的工作原理。它与Java代码无关 如果您使用类似于
cat>textfile
的命令进行测试,您会发现,除非您位于行的开头,^D
不会像您预期的那样立即结束文件。(我不知道这种行为的所有细节,但这就是要点。)
Linux的惯例是文本文件总是以换行符结尾。如果你不遵守惯例,你可能会遇到这样的问题
但是,我不确定您在使用重定向发送数据时程序挂起的问题。这一部分对我来说更令人惊讶,因为它不是交互式的,所以终端行为不应该成为问题。我通过“java-cp…/bin snippet.snippet”和“java-jar snippet.jar”以及“/play”运行了您的代码。两个都很好(只需要一个^D)。[使用oracle java sdk 1.7.051、ubuntu 12.04.4、bash shell]这就是java的工作原理,谢谢!最后我找到了解决办法。./check运行的脚本是在Scheme中编写的,输入流机制不同于Java。我通过在Java的InputStream中使用available()方法解决了这个问题。
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);