2015-04-05 6 views
0

я запускаю команду оболочки с Process Builder:ProcessBuilder ничего не выводит

try { 
    ProcessBuilder lmBuilder = new ProcessBuilder("/home/istanbul/srilm/bin/i686-m64/ngram-count", "-text", modelPath, "-order", "3", "-lm", modelOutputPath); 
    lmBuilder.redirectErrorStream(); 
    final Process lmProcess = lmBuilder.start(); 
    int result = lmProcess.waitFor(); //result becomes 0 
    InputStream is = lmProcess.getInputStream(); 
    InputStreamReader isr = new InputStreamReader(is); 
    BufferedReader br = new BufferedReader(isr); 

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

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

Когда я проверить вывод команды я вижу, что он работает правильно. Когда я запускаю его через оболочку я вижу, что выход:

warning: discount coeff 1 is out of range: 0 
warning: discount coeff 7 is out of range: 1.06876 
warning: discount coeff 7 is out of range: 2.09945 

Однако, когда я бегу он с помощью процесса строитель я не могу видеть никаких.

Любые идеи?

+2

Не ваш вызов 'Waitfor()' блокировки? Не следует ли читать потоки в своих потоках, потоки, которые запускаются до вызова 'waitFor()'? –

+2

Попробуйте использовать ['ProcessBuilder # inheritIO'] (http://docs.oracle.com/javase/7/docs/api/java/lang/ProcessBuilder.html#inheritIO()) и посмотрите, помогает ли это – MadProgrammer

+0

@MadProgrammer вы правы, inheritIO работает в моем случае. Однако redirectErrorStream (true) работает тоже. – kamaci

ответ

2
lmBuilder.redirectErrorStream(); 

Это неверное описание.

Этот метод только сообщает, перенаправляете ли вы stderr на stdout; он не указывает, что stderr должен быть перенаправлен на него.

Что вы должны использовать это:

lmBuilder.redirectErrorStream(true); 
+0

Вы правы, когда я не использую redirectErrorStream или redirectErrorStream(), он ничего не выводит. Однако у меня есть другая проблема, когда я не использую waitFor(), она выводит правильно bu при использовании приложения waitFor(). Как я могу убедиться, что все выходные данные выбраны буферизованным считывателем? – kamaci

Смежные вопросы