【问题标题】:How to read from command line parameter or stdin redirection in java?如何从 java 中的命令行参数或 stdin 重定向中读取?
【发布时间】:2023-03-25 08:23:01
【问题描述】:

this stackoverflow.com response 中我看到了如何同时获得两者,而不是分别获得。

我想在 java 命令行中获取参数或标准输入重定向。

我是这样解决的:

public static void main(String[] args) {

  String fileInput = "";

  try {
      if (System.in.available() > 0) {
          InputStreamReader isr = new InputStreamReader(System.in);
          int ch;
          while((ch = isr.read()) != -1) {
              //System.out.print((char)ch);
              fileInput += (char)ch;
          }  
      }
  } catch(IOException e) {
      e.printStackTrace();
  }

  if ( ((fileInput.length() > 0) && (args.length > 0)) ||
       ((fileInput.length() == 0) && (args.length != 1)) ||
       ((fileInput.length() == 0) && (args.length == 0))   
     ) {
      System.out.println("Use: myprogram \"string\"");
      System.out.println("Use: myprogram < file");
      System.exit(0); 
  }

但我有一个疑问。正如Oracle 10 help 所说:“返回一个估计可以从此输入流中读取(或跳过)的字节数,而不会被下一次调用此输入流的方法阻塞。下一次调用可能是同一个线程或另一个线程。单次读取或跳过这么多字节不会阻塞,但可能会读取或跳过更少的字节

请注意,虽然 InputStream 的某些实现会返回流中的总字节数,但很多不会。使用这个方法的返回值来分配一个缓冲区来保存这个流中的所有数据是不正确的。”。

我的问题是:方法 available() 总是会知道有一个标准重定向?有std重定向时总是返回> 0?

在我的测试中运行良好,但我不知道它是否在所有实现中都能正常运行。

【问题讨论】:

    标签: java parameters stdin


    【解决方案1】:

    如果您从另一个程序 otherprogram | myprogram 进行管道传输,则其他程序提供数据的速度可能很慢,因此您无法对此进行测试。

    正因为如此,命令,尤其是在 Linux 上,通常会指定参数值 - 来指示应从 STDIN 读取数据。

    例如

    # No-arg call prints options
    myprogram
    
    # Arg not '-' means to use argument value
    myprogram "string"
    
    # '-' means to read STDIN
    myprogram - < file
    
    otherprogram | myprogram -
    

    【讨论】:

    • 谢谢@Andreas。我只有一个问题:如果 myprogram 需要 - 作为参数怎么办?
    • @oml 使用其他东西。我说这样做是常见的,不是必须的。
    猜你喜欢
    • 1970-01-01
    • 2011-08-10
    • 1970-01-01
    • 1970-01-01
    • 2016-05-24
    • 2017-03-16
    • 2011-08-06
    • 2016-06-09
    相关资源
    最近更新 更多