2015-10-01 2 views
1

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

import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.InputStreamReader; 

public class Driver { 
    public static void main(String[] args) { 
     try { 
      Process process = new ProcessBuilder("/usr/bin/R").start(); 
      InputStream is = process.getInputStream(); 
      InputStreamReader isr = new InputStreamReader(is); 
      BufferedReader br = new BufferedReader(isr); 
      String line; 

      while ((line = br.readLine()) != null) { 
       System.out.println(line); 
      } 


     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 
} 

Я ожидаю, что версия R и другие вещи, которые будут отображаться, когда я начинаю R в терминале, печататься в консоли. Но ничего не печатается, и исключений нет.

В чем проблема?

EDIT

Моя программа выше работает, когда я использую команду типа «LS» или «пс». но не для какой-либо команды, которая не выходит из нее

+0

Во-первых, когда вы запускаете процесс через java, он доступен для просмотра в верхней командной строке на * unix или в проводнике процессов под Windows? –

+0

должен ли он быть включен в верхнюю часть даже после выхода моей программы Java? – DesirePRG

+0

Перед тем, как начать чтение, попытайтесь закрыть выходной поток процесса. – EJP

ответ

2

Поскольку процесс запускается в отдельном потоке, br может иметь неправильное состояние, когда выполнение достигает цикла.

Примитивное решение: если вам не нужно взаимодействовать с запущенным процессом, вы можете добавить process.waitFor() перед циклом, чтобы убедиться, что процесс завершен и доступен выход.

В общем случае для взаимодействия с внешним процессом потребуются отдельные потоки для контроля состояния, чтения std и std err потоков. В этом случае имеет смысл использовать библиотечное решение, например. Apache Commons Exec (см. the tutorial)

+0

Я использовал образец общей формы программы и работает только с командами, которые выходят сами. Мне нужно прочитать из процесса, который не выходит сам по себе. есть способ сделать это в commons – DesirePRG

+0

Я не уверен, что такое новый код, но попробуйте использовать 'PumpStreamHandler' и асинхронную форму exec:' Executor.execute (команда CommandLine, обработчик ExecuteResultHandler) ' –