2013-06-06 2 views
0

Я работаю над чтением вывода скрипта, который вызывается с использованием процесса Java. Тем не менее, в середине запуска скрипта он будет в НЕКОТОРЫХ ситуациях попросить пользователя ответить y/n для продолжения. Однако, прочитав много сообщений в StackOverflow, я все еще задерживаюсь при обнаружении приглашения и затем отправляю ответ, пока процесс все еще запущен.Чтение состояния процесса Java с помощью InputStream, а затем отправки команд с помощью OutputStream

Если у кого-то есть идеи, это было бы замечательно.

Я пробовал читать из класса Scanner и System.console, чтобы не превалировать.

Вот часть кода, который я использую.

Process p; 

    String file = "./upgrade.sh"; 


     cmds.add(file); 
     cmds.add(sourcePath); 
     cmds.add(outputDirectoryPath); 
     cmds.add(zip); 
     cmds.add("-c"); 
    //} 

    pb = new ProcessBuilder(cmds); 
    pb.directory(new File(binDir)); 

    p = pb.start(); 

    BufferedReader reader = new BufferedReader (new InputStreamReader(p.getInputStream())); 
    BufferedReader reader2 = new BufferedReader (new InputStreamReader(p.getErrorStream())); 
    BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(p.getOutputStream())); 

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


     reader.close(); 
     writer.close(); 
    } 
    catch (IOException e) 
    { 
     e.printStackTrace(); 
    } 

    p.destroy(); 
+0

Было бы лучше, если бы ваш сценарий имел не интерактивный режим работы. – fge

+0

К сожалению, у меня нет контроля над сценарием –

ответ

1

Проблема в том, что вы используете BufferedReader. Он вернется только тогда, когда прочитает полную строку, то есть разделитель строк. Но если скрипт запрашивает что-то с подсказкой, не будет разделителя строк! В результате он НЕ вернется.

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

+0

Что вы предлагаете? –

+0

Хороший вопрос, мне никогда не приходилось делать это на Java ... Но я думаю, что быстрый поиск даст некоторую информацию. – fge