【问题标题】:Linux command input done in Java用 Java 完成的 Linux 命令输入
【发布时间】:2013-08-29 16:03:11
【问题描述】:

Linux 中的许多命令采用两种方式中的一种输入,stdin 或作为文件的参数。例子

echo "来自标准输入的文本" | lpr

lpr 文件名.txt

echo "来自标准输入的文本" | nl

nl 文件名.txt

awk、sed、grep 和许多其他方法也是如此。用 Java 编写的命令行应用程序怎么会发生同样的行为?我相信 System.in 代表标准输入。阅读标准输入并不困难。从文件中读取并不难,但应用程序如何根据在命令行中的调用方式进行操作?

【问题讨论】:

    标签: java linux input stdin


    【解决方案1】:

    您处理main(String[] args) 方法的参数。如果提供了参数,args[0] 将是非空的,因此您可以假设/验证它是一个文件名。否则,假设/验证输入是通过标准输入提供的。

    在代码中:

     public static void main(String[] args) {
      if (args.length > 0) {
           String filename = args[0];
           ... // process the file
      }
      else { 
         Scanner sc = new Scanner(System.in);
         ... // process STDIN
       }
     }
    

    【讨论】:

      【解决方案2】:

      你可以做典型的 unix 程序做的事...检查命令行参数(传递给 main(String[] args) 方法,如果没有给出适当的输入文件,则使用 System.in

      【讨论】:

        【解决方案3】:

        基本上,您必须解析传递给您的 java 应用程序的参数。这些参数将指示您的程序逻辑如何处理传递给标准输入的信息。

        您可以使用此处所示的简单方式解析参数 http://docs.oracle.com/javase/tutorial/essential/environment/cmdLineArgs.html

        或者您可以使用此处提到的强大库

        How to parse command line arguments in Java?

        【讨论】:

          【解决方案4】:

          这只是编程。例如:

             public class Main {
          
                 public void run(OutputStream out) {
                     // Write output to 'out'
                 }
          
                 public static void main(String[] args) {
                     if (args.length == 1) {
                         try (FileOutputStream out = new FileOutputStream(args[0])) {
                             new Main().run(out);
                         }
                     } else {
                         new Main().run(System.out);
                     }
                 }
              }
          

          此版本假定第一个参数是输出文件名,如果没有给出文件名,则写入标准输出。您可以对标准输入执行相同的操作,并且可以以不同的方式处理参数。


          注意:您可以使用System.setOut(...) 来修改JVM 的System.out“变量”,而不是使用out 参数。但我更喜欢这样做,因为它使应用程序逻辑更可重用。 (考虑您想在更大的应用程序中嵌入/使用Main 类的情况......将System.out 用于其他目的。)

          【讨论】:

            猜你喜欢
            • 2014-01-06
            • 1970-01-01
            • 2010-10-14
            • 1970-01-01
            • 2011-09-20
            • 1970-01-01
            • 2013-08-21
            • 1970-01-01
            • 2021-06-28
            相关资源
            最近更新 更多