使用命令行使用Java管道输入
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'吗?
程序命令行中给出的参数不会转到System.in
,它们会进入args
数组。 你可以使用echo hello | java ReadInput
东西 用于运行程序的echo hello | java ReadInput
,或者您可以修改程序以查看其args
数组并将其视为输入。 (如果使用后一种选项,如果args
没有任何内容,您可能希望回退到从System.in
读取。)
当你键入java ReadInput hello
你还没有(还)向System.in
提供任何输入,所以程序执行会阻塞,直到有东西要读。 您可能会注意到字符串"hello"
被传递到main()
方法的args
参数中。
如果您正在使用调试器(我强烈建议),请在main()
的第一行放置一个断点。 您会注意到,当您以java ReadInput hello
运行程序时, args[0]
为"hello"
。
如果您没有使用调试器,则可以使用System.out.println()
(这是初学者经常调试其代码的方式)。 添加以下代码行作为main()
的第一行:
if (args.length > 0) System.out.println(args[0]);
上述其他两个答案都是部分正确的,但部分误导。
使用以下语法…
java ReadInput < input.txt
...在java二进制文件上运行的实际命令是:
java ReadInput
操作系统shell解释<
sign,并将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(“”))。
希望这可以帮助。
使用终止标准输入
Ctrl-D : Linux/Unix Ctrl-Z (or F6) and "Enter" : Windows.
或者自己设置一个special EOF symbol
。