Общение с помощью инструмента командной строки в Java - PullRequest
5 голосов
/ 24 августа 2010

Я хочу использовать инструмент командной строки linux из моей программы на Java.Я запускаю программу и получаю вывод, используя класс Process (http://download.oracle.com/javase/6/docs/api/java/lang/Process.html):

 /* @param args
  * @throws IOException 
  */
 public static void main(String[] args) throws IOException {
    Process proc = Runtime.getRuntime().exec("octave");

    BufferedReader reader = 
        new BufferedReader(new InputStreamReader(proc.getInputStream()));

    BufferedReader errorReader = 
        new BufferedReader(new InputStreamReader(proc.getInputStream()));

    BufferedWriter writer = 
        new BufferedWriter(new OutputStreamWriter(proc.getOutputStream()));

    int c;
    while((c = proc.getInputStream().read()) != -1) {
       System.out.print((char)c);
    }
    System.out.println("End");
 }

. Я получаю следующий вывод:

GNU Octave, версия 3.0.5 Авторское право (C) 2008 John W. Eaton и др. Это бесплатное программное обеспечение; см. Исходный код для условий копирования. АБСОЛЮТНО НЕТ ГАРАНТИИ, даже для ПРОДАЖИ или ПРИГОДНОСТИ ДЛЯ ОСОБЫЙ ЦЕЛИ.

Octave настроен для "i486-pc-linux-gnu".

Дополнительную информацию о Octave можно получить по адресу http://www.octave.org.

Пожалуйста, внесите свой вклад, если эта программа окажется полезной.информация, посетите http://www.octave.org/help-wanted.html

Сообщить об ошибках (но сначала прочтите http://www.octave.org/bugs.html, чтобы узнать, как написать полезный отчет).

Для получения информации об изменениях по сравнению с предыдущими версиямивведите `news '.

Странная вещь, если я запускаю октаву в терминале, выглядит нормально:

: ~ / workspace / Console / src/ c $ октава
GNU Октава, верsion 3.0.5 Copyright (C) 2008 Джон У. Итон и другие.Это бесплатное программное обеспечение;см. исходный код для условий копирования.АБСОЛЮТНО НЕТ ГАРАНТИИ;даже не для ИЗДЕЛИИ или ФИТНЕСА ДЛЯ ОСОБЕННОЙ ЦЕЛИ.Для получения более подробной информации введите «гарантия».

Octave был настроен для «i486-pc-linux-gnu».

Дополнительная информация о Octave доступна по адресу http://www.octave.org.

Пожалуйста, помогите, если вы найдете это программное обеспечение полезным.Для получения дополнительной информации посетите http://www.octave.org/help-wanted.html

Сообщить об ошибках (но сначала прочтите http://www.octave.org/bugs.html, чтобы узнать, как написать полезный отчет).

Для получения информации об изменениях сВ предыдущих версиях введите `news '.

октава: 1>

Поэтому символы в строке, где запрашивается ввод, не отправляются в мой поток ввода.Зачем?Разве невозможно определить, запрашивается ли ввод?

Спасибо за ваши ответы!

Генрих

Ответы [ 5 ]

7 голосов
/ 24 августа 2010

Программы на * nix могут определять, разговаривают ли они с терминалом или другим потоком.И многие интерактивные программы типа оболочки по-разному реагируют на это (устанавливая разные приглашения, не читая некоторые файлы инициализации или даже вообще не запускаясь).

Вы можете столкнуться с одной из этих ситуаций.*

Также, возможно, проще использовать Java API для октавы: joPAS , например.

2 голосов
/ 24 августа 2010

Вы не получаете приглашение "octave: 1>", потому что выход октавы буферизуется.Многие программы, которые используют stdio в Unix / Linux, будут делать то же самое, если вывод не на интерактивное устройство.Вы не получите вывод до тех пор, пока буфер не заполнится (автоматически очищается) или буфер не будет явно очищен программой, вызывающей fflush (3).

Если вы действительно хотите взаимодействовать с программой командной строки, тогда вынужно использовать pty (что-то, чего я не знаю, возможно с java, так как я никогда не пробовал его).

Выдержка из "man stdio", которая объясняет, что происходит:

  At  program  startup, three text streams are predefined and need not be
  opened explicitly -- standard input (for reading conventional input),
  standard  output  (for  writing conventional input), and standard error
  (for  writing  diagnostic  output).   These  streams  are   abbreviated
  stdin,stdout and stderr.  When opened, the standard error stream is not
  fully buffered;  the  standard  input  and  output  streams  are  fully
  buffered  if  and only if the streams do not to refer to an interactive
  device.

  Output streams that refer to terminal devices are always line  buffered
  by  default;  pending  output  to such streams is written automatically
  whenever an input stream that refers to a terminal device is read.   In
  cases  where  a large amount of computation is done after printing part
  of a line on an output terminal, it is necessary to fflush(3) the stan-
  dard  output  before  going  off  and computing so that the output will
  appear.
2 голосов
/ 24 августа 2010

Поскольку ваша проблема связана с октавой, я предлагаю использовать опцию --silent для октавы и передать все параметры в командной строке за одно нажатие.Это позволит обойти проблемы, отмеченные ранее при запуске терминальной сессии.

1 голос
/ 01 сентября 2010

Я мог бы наконец решить проблему: под Linux, используйте Octave с --interactive и, в конце концов, с опцией --no-line-edit, и это сработало:)

Heinrich

1 голос
/ 24 августа 2010

Может ли быть так, что он открывает новый дескриптор файла для этого приглашения?

Вы можете найти это в исходном коде октавы (или в исходном коде readline, если это использует октава).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...