2008-09-15 2 views
4

При запуске процесса из Java, stderr и stdout могут блокировать вывод, если я не читаю из труб. В настоящее время у меня есть поток, который активно читает из одного и основного блоков потоков, с другой.Удаление стандартной ошибки в Java

Есть ли простой способ присоединиться к двум потокам или иначе заставить подпроцесс продолжать, не теряя данные в stderr?

ответ

4

Установите свойство redirectErrorStream на ProcessBuilder отправить вывод Stderr на стандартный вывод:

ProcessBuilder builder = new ProcessBuilder(command); 
builder.redirectErrorStream(true); 

Вы должны затем создать поток, чтобы справиться с потоком процесса, что-то вроде следующего:

Process p = builder.start(); 

InputHandler outHandler = new InputHandler(p.getInputStream()); 

Где InputHandler определяется как:

private static class InputHandler extends Thread { 

    private final InputStream is; 

    private final ByteArrayOutputStream os; 

    public InputHandler(InputStream input) { 
     this.is = input; 
     this.os = new ByteArrayOutputStream(); 
    } 

    public void run() { 
     try { 
      int c; 
      while ((c = is.read()) != -1) { 
       os.write(c); 
      } 
     } catch (Throwable t) { 
      throw new IllegalStateException(t); 
     } 
    } 

    public String getOutput() { 
     try { 
     os.flush(); 
     } catch (Throwable t) { 
      throw new IllegalStateException(t); 
     } 
     return os.toString(); 
    } 

} 

В качестве альтернативы, jus t создайте два InputHandlers для InputStream и ErrorStream. Знание того, что программа будет заблокирована, если вы не прочтете их, - это 90% битвы :)

0

Просто у вас есть две темы, одна из которых написана на stdout, одна из stderr?

+0

Я тоже хотел бы упомянуть об этом ... но это было слишком легко. – jjnguy

+1

Я упомянул об этом в вопросе; Я искал ответ, который не был основан на потоках. –

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