2016-12-12 4 views
0

Я использую ProcessBuilder для запуска системной команды из java. Системная команда может запрашивать входные данные от пользователя. Ошибка программы, когда системная команда запрашивает входные данные от пользователя несколько раз. Пример запуска подобной команды из командной строки непосредственно:java ProcessBuilder: запустить программу с несколькими входами

>test-input 
Continue? Y/N 
y 
Entered y 
Again: Continue? Y/N 
y 
Entered y 

Если я использую мою программу, основанную ProcessBuilder запустить «тест-вход», он либо зависает, либо не принимать вход во второй раз. Вот код логики чтения/записи. Чтение из входного потока (обработки исключительных ситуаций и поток близких логик опущено)

ProcessBuilder pb = new ProcessBuilder(cmdList); 
pb.redirectErrorStream(true); 
pb.directory(new File("some-test-dir")); 
process = pb.start(); 
InputStream is = process.getInputStream(); 
int value = -1; 
while ((value = is.read()) != -1) { 
    reader.append((char)value); 
} 
int result = process.waitFor(); 

Записать в выходной поток:

public void write(String s) { 
    OutputStream os = null; 
    try { 
     os = process.getOutputStream(); 
     os.write(s.getBytes(Charset.forName("UTF-8"))); 
    } 
    catch (IOException e) { 
     //... 
    } 
    finally { 
     // Problematic 
     os.close(); 
    } 
} 

Проблема произошла на линии os.close(). Если я его там разместил, выходной поток закрывается после обработки первых входных данных, поэтому он не может быть повторно открыт, и программа не может принимать второму входному данным. Если я не закрываю выходной поток, программа там зависает, как is.read() блокируется навсегда. Как решить эту проблему? благодаря

+1

Не продолжаю называть process.getOutputStream(). Вызовите 'новый OuptutStreamWriter (process.getOutputStream()) один раз за процесс и используйте его. Вызовите метод 'flush()' автора после каждой записи. (Не связано напрямую: неверно предположить, что один байт является одним символом. Оберните InputStream вашего процесса в InputStreamReader и используйте метод чтения InputStreamReader.) – VGR

+0

спасибо за указание связи между одним байтом и одним символом – CMZS

ответ

0

Проблема фиксируется путем написания символа новой строки для каждого входа, как описана в: Writing to InputStream of a Java Process

os.write(s.getBytes(Charset.forName("UTF-8"))); 
os.write('\n'); 
os.flush();