public class ReadInput {
public static void main(String[] args) throws IOException {
BufferedReader input = new BufferedReader(new InputStreamReader(System.in));
String x = null;
while( (x = input.readLine()) != null ) {
System.out.println(x);
}
}
}
我可以通过输入'java ReadInput<来从命令行运行此代码input.txt'但不是直接输入输入,如'java ReadInput hello'。当我输入'java ReadInput hello'时,由于某种原因,我似乎陷入无限循环。它不应该像键入'java ReadInput<一样工作。 input.txt'但只是重印'hello'?
答案 0 :(得分:6)
程序命令行上给出的参数不会转到System.in
,它们会进入args
数组。您可以使用echo hello | java ReadInput
之类的东西来运行程序,或者您可以修改程序以查看其args
数组并将其视为输入。 (如果您使用后一种选项,如果System.in
中没有任何内容,您可能希望退回到args
的阅读。)
答案 1 :(得分:3)
当你输入java ReadInput hello
时,你还没有({)向System.in
提供任何输入,所以程序执行会阻塞,直到有东西要读。您可能会注意到字符串"hello"
已传递到args
方法的main()
参数。
如果您正在使用调试器(我强烈推荐),请在main()
的第一行放置一个断点。当您将java ReadInput hello
args[0]
"hello"
System.out.println()
作为main()
运行时,您会注意到。
如果您没有使用调试器,则可以使用if (args.length > 0) System.out.println(args[0]);
(这是初学者经常调试代码的方式)。将此行代码添加为{{1}}的第一行:
{{1}}
答案 2 :(得分:3)
上述其他两个答案都是部分正确的,但有部分误导。
使用以下语法...
java ReadInput < input.txt
...在java二进制文件上运行的实际命令是:
java ReadInput
操作系统shell 解释<
符号,并将input.txt的内容发送到标准输入流(System.in)。
当您致电System.in.readLine()
时,代码会检查标准输入流中是否有可用的输入线。当您在文件中传送时,这意味着它需要文件的下一行(就好像操作系统正在获取文件的内容并在提示符下键入它们)。当你运行程序而不管道文件时,它将等到你(用户)从shell提供一行输入并按回车键。
JVM的命令行参数的工作方式不同,不使用标准输入流(System.in)。例如:
java ReadInput "Input number one" "Input number two"
在这种情况下,您传递两个命令行参数。这些属性将通过args
数组提供:
public static void main(String[] args) throws IOException {
System.out.println(args.length); //3
System.out.println(args[0]); //"ReadInput"
System.out.println(args[1]); //"Input number one"
System.out.println(args[2]); //"Input number two"
}
使用您提供的代码,当readLine()调用的结果返回null
时,程序将结束。我相信您可以在提示符处按Enter键发送空行,然后结束程序。如果没有,您可能必须修复程序以检查空字符串(input.readLine()。equals(“”))。
希望这有帮助。
答案 3 :(得分:1)
使用
终止标准输入Ctrl-D : Linux/Unix
Ctrl-Z (or F6) and "Enter" : Windows.
或者自己设置 special EOF symbol
。