Ввод командной строки в Java

Вот простой фрагмент кода:

import java.io.*;
public class Read {
 public static void main(String[] args) {
     BufferedReader f = new BufferedReader(new InputStreamReader(System.in));
  while(true)
  {
   String x = null;
   try{
    x = f.readLine();
   }
   catch (IOException e) {e.printStackTrace();}
   System.out.println(x);
  }
 }
}

Я выполняю это как: java Read ‹ input.txt

Как только input.txt полностью передан в программу, x продолжает получать бесконечные нули. Почему это так? Есть ли способ, с помощью которого я могу активировать Standard In (Command Line) после того, как файл, загруженный в код, будет выполнен? Я пытался закрыть поток и снова открыть, это не работает. Сброс и т. д. также.


person TJ-    schedule 16.09.2009    source источник
comment
Был ли исходный код отредактирован с учетом принятого ответа. Потому что этот ответ, похоже, сейчас не применим к этому коду: код не читает файл из списка аргументов или что-то подобное, как следует из ответа. В таком случае было бы лучше оставить ошибочный код на месте, чтобы вся эта страница имела больше смысла.   -  person Rondo    schedule 22.10.2014
comment
@ Рондо - нет. Вот версии.   -  person TJ-    schedule 22.10.2014


Ответы (4)


Выполняя "java Read < input.txt", вы сообщаете операционной системе, что для этого процесса переданный файл является стандартным. Вы не можете затем вернуться к командной строке из приложения.

Если вы хотите сделать это, передайте input.txt в качестве параметра имени файла в приложение, откройте/прочитайте/закройте файл самостоятельно из приложения, затем прочитайте из стандартного ввода, чтобы получить материал из командной строки.

person skaffman    schedule 16.09.2009
comment
Спасибо за ответ, стало ясно - person TJ-; 17.09.2009

Что ж, это типично для чтения в формате BufferedReader. readLine() возвращает null при достижении конца потока. Возможно, проблема в вашем бесконечном цикле ;-)

// try / catch ommitted

String x = null;

while( (x = f.readLine()) != null )
{
   System.out.println(x);
}
person SingleShot    schedule 16.09.2009

Вам нужно завершить цикл while, когда строка равна нулю, например:

    BufferedReader in = null;
    try {
        in = new BufferedReader(new InputStreamReader(System.in));
        String line;
        while ((line = in.readLine()) != null) {
            System.out.println(line);
        }
    }
    catch (IOException e) {
        logger.error("IOException reading System.in", e);
        throw e;
    }
    finally {
        if (in != null) {
            in.close();
        }
    }
person dogbane    schedule 16.09.2009

Есть ли способ, с помощью которого я могу активировать Standard In (Command Line) после того, как файл, загруженный в код, будет выполнен?

Извините, что поднимаю старый вопрос, но пока ни один из ответов не указывает на то, что существует существует (только для оболочки) способ вернуться к консольному вводу после передачи в файл.

Если вы запустите команду

{ cat input.txt & cat; } | java Read

затем текст из input.txt будет передан в java Read, а затем вы вернетесь к консольному вводу.

Обратите внимание, что если вы затем нажмете Ctrl+D, вы получите бесконечный цикл nulls, если только вы не модифицируете свою программу, чтобы завершить цикл, когда она получает null.

person John Gowers    schedule 02.12.2016