使用命令行使用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