2015-05-04 3 views
0


У меня есть эта проблема, с которой я недавно наткнулся.
Я использую ProcessBuilder для вызова внешнего процесса. Процесс может возвращать либо удобочитаемую строку, либо сжатый контент.
код выглядит следующим образом:
Предоставление потребителям InputStream от ProcessBuilder

ProcessBuilder pb = new ProcessBuilder(args); 
pb.redirectErrorStream(true); 
Process p = pb.start(); 
p.waitFor(); 
return p.getInputStream(); 


Это нормально для небольшого входа, но для больших одного процесса блоков, ожидающих буфера опорожнить. Потребительский код уже реализован, так есть ли другой способ извлечения из этой функции InputStream?

ответ

0

Проблема заключается в том, что процесс не сможет записываться во входной поток, если потребляющий поток не потребляет значения во входном потоке за пределами размера буфера.

Если вы не хотите изменять потребительский код, одно из решений, о котором я могу думать, - это прочитать весь поток входных данных процесса в StringBuffer, а затем вернуть поток ввода в StringBuffer вместо потока ввода процесса.

InputStream startProcess() { 
    ProcessBuilder pb = new ProcessBuilder(args); 
    pb.redirectErrorStream(true); 
    Process p = pb.start(); 
    String dummy; 
    final StringBuffer buffer = new StringBuffer(); 
    new Thread(new Runnable() { 
     void run(){ 
      while(dummy = pb.getInputStream().readLine() != null) 
      buffer.append(dummy); 
     } 
    }).start(); 
    p.waitFor(); 
    return new ByteArrayInputStream(buffer.toString().getBytes()); 
} 

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

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