2013-07-29 4 views
0

Я хочу открыть внешнее приложение с помощью java.взаимодействует с консольным приложением с помощью java

Process p = Runtime.getRuntime().exec("/Users/kausar/myApp"); 

Это запускает процесс, как я могу видеть в мониторе активности. Теперь я запускаю файл на самом деле консольное приложение, которое затем принимает команды и дает ответ на основе этих команд. , например, если я иду в терминал и поставить тот же

Kausars-MacBook-Air:~ kausar$ /Users/kausar/myApp 
    myApp> 

Теперь я могу давать команды приложение, как, например

myApp> SHOW 'Hi There' 

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

 String res;   
    String cmnd = "SHOW \'Hi There\'"; 
    OutputStream stdin = null; 
    InputStream stdout = null; 
    stdout = p.getInputStream(); 
    stdin = p.getOutputStream(); 

    stdin.write(cmnd.getBytes()); 
    stdin.flush(); 
    p.waitFor(); 

    BufferedReader input = new BufferedReader(
       new InputStreamReader(stdout)); 
      while ((res = input.readLine()) != null) { 
      System.out.println(res) 
      } 
      input.close(); 

    p.destroy(); 

Его отображение ничего в той же процедуре, что и «/ bin/bash -c ls», работает отлично. , пожалуйста, помогите!

+0

Вы определяете stderr как входной поток и присваиваете p.getInptStream для stdout. – Guanxi

+0

@ Guanxi исправил это, возможно, это была ошибка копирования пасты, спасибо, что указали это – kausar

ответ

0

Из рук я бы сказал, что проблема с р. * ждать * Для() точно, какого объекта и когда ЮСЕЕ уведомить() или notifyAll() вызов просыпается объект поток будет что-то вроде на stdout и, возможно, реструктуризация процесса. примечание: интересной особенностью является поле класса в BufferedReader, называемое «блокировка», в api docs упоминается какой-то способ структурирования вашей программы, чтобы он мог быть уведомлен.

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