使用Java通过命令行传输输入

6
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”吗?

4个回答

7
程序命令行中给定的参数不会进入 System.in,而是进入 args 数组。您可以使用类似于 echo hello | java ReadInput 的方式运行程序,或者您可以修改程序以查看其 args 数组并将其视为输入。(如果您选择后一种选项,则可能希望在 args 中没有内容时回退到从 System.in 读取。)

5

以上两个答案都有一定的正确性,但也有误导成分。

使用以下语法...

java ReadInput < input.txt

实际运行的Java二进制命令是:

java ReadInput

操作系统解释了<符号,并将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时,程序将终止。我认为您可以在提示符处按回车键发送空行并结束程序。如果无法,请修复程序以检查空字符串(input.readLine().equals(""))。
希望这可以帮助您。

2
在*nix系统中,您可以使用Ctrl-D(EOF代码)终止输入,该代码终止stdin管道。 - Mike Tunnicliffe

3
当您键入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]);

如果是这种情况,您知道我如何仅使用命令行输入一些内容吗?我理解您所说的“hello”实际上是args [0],但是如果我想测试我的代码而不必指定要读取的文件怎么办? - mephisto_
@mephisto_,请看我回答中使用echo将输入导入程序的示例。 - Wyzard

1

使用

标记结束标准输入。

Ctrl-D  :  Linux/Unix 
Ctrl-Z (or F6) and "Enter" : Windows.

或者设置一个特殊的EOF符号。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接