【问题标题】:Piping Input using Java using command line使用命令行使用 Java 管道输入
【发布时间】:2011-05-07 01:16:11
【问题描述】:
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

【问题讨论】:

    标签: java input piping


    【解决方案1】:

    在程序命令行中给出的参数不会转到System.in,而是放在args 数组中。您可以使用echo hello | java ReadInput 之类的东西来运行程序,或者您可以修改程序以查看其args 数组并将其视为输入。 (如果您使用后一个选项,如果 args 中没有任何内容,您可能希望退回到从 System.in 读取。)

    【讨论】:

      【解决方案2】:

      以上其他两个答案都部分正确,但部分具有误导性。

      使用以下语法...

      java ReadInput < input.txt
      

      ...在 java 二进制文件上运行的实际命令是:

      java ReadInput

      操作系统外壳解释&lt;符号,并将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(""))。

      希望这会有所帮助。

      【讨论】:

      • 在 *nix 上,您可以使用 Ctrl-D 终止输入(终止标准输入管道的 EOF 代码)。
      • @fd:谢谢,我不知道。
      【解决方案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]);
      

      【讨论】:

      • 如果是这种情况,您知道我将如何仅使用命令行输入一些输入吗?我理解您所说的“hello”实际上是 args[0] 的意思,但是如果我想测试我的代码而不必指定要读取的文件怎么办?
      • @mephisto_,请参阅我使用echo 将输入管道输入到程序的答案中的示例。
      【解决方案4】:

      终止标准输入
      Ctrl-D  :  Linux/Unix 
      Ctrl-Z (or F6) and "Enter" : Windows.
      

      或者自己设置一个special EOF symbol

      【讨论】:

        猜你喜欢
        • 2010-11-28
        • 2011-04-16
        • 2020-03-11
        • 2020-03-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多