Как читать из командной строки параметр или перенаправление стандартного ввода в java? - PullRequest
0 голосов
/ 07 апреля 2020

В этот ответ stackoverflow.com Я видел, как получить оба одновременно, но не по отдельности.

Я хочу получить в командной строке java параметр или перенаправление stdin .

Я решил это так:

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 вернет общее количество байтов в потоке, многие не будут. Никогда не правильно использовать возвращаемое значение этого метода для выделения буфера, предназначенного для хранения всех данных в этом потоке. ".

My вопрос: метод available () всегда будет знать, что существует перенаправление std? Всегда будет возвращать> 0 при перенаправлении std?

В моих тестах все работало нормально, но я не знаю, будет ли оно работать во всех реализациях.

1 Ответ

0 голосов
/ 07 апреля 2020

Если вы работаете с другой программой, 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 -
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...