Java запускает команду bash при подаче и вводе данных - PullRequest
0 голосов
/ 28 марта 2012

Мне нужно записать некоторый код Java, который запускает внешний процесс.Этот процесс получает строку ввода от stdin и дает строку вывода на stdout.

Код, который я написал, выглядит следующим образом

try
{            
    Runtime rt = Runtime.getRuntime();
    Process proc = rt.exec("./" + args[0]);
    Process proc2 = rt.exec(c);
    int exitVal = proc2.exitValue();
    System.out.println("Process exitValue: " + exitVal);
} 
catch (Throwable t){
}

Где args [0] - внешний процесс, а c -вход (строка), я должен кормить процесс.Если бы он работал правильно, я бы получил exitVal = 0, вместо этого я ничего не получу.Кроме того, я действительно хочу напечатать вывод внешнего процесса (в данном примере это «6»).

Ответы [ 3 ]

2 голосов
/ 28 марта 2012

Вы должны использовать getInputStream() и getOutputStream() в процессе его передачи, см. javadocs .

Если вы не прочитаете все данные из процесса, он может зависнуть и даже зайти в тупик. Краткое введение в общие проблемы см. В этом блоге . По крайней мере, вы должны читать все данные из вывода процесса.

0 голосов
/ 28 марта 2012

Вы можете передать ввод программы с помощью перенаправления «<»: </p>

{
  Process p = Runtime.getRuntime().exec("wc < pom.xml");
  p.waitFor();
  System.out.println(p.exitValue());
  BufferedReader bri = new BufferedReader
    (new InputStreamReader(p.getInputStream()));
  String line;
  while ((line = bri.readLine()) != null) {
    System.out.println(line);
  }
  bri.close();
}
0 голосов
/ 28 марта 2012

Вы не можете «ничего не получить».Метод exitValue() возвращает примитивный тип, поэтому он даже не может быть нулевым.Но этот метод может застрять.Это происходит потому, что ваш процесс все еще работает.

Возможно ли, что он работает, потому что вы его не "кормили"?В этом случае единственное, что вам нужно сделать, это позвонить proc2.getOutputStream() и записать то, что вам нужно, в этот поток.Если вы хотите прочитать выходные данные процесса, используйте proc2.getInputStream() и прочитайте из потока.

Кстати, посмотрите на ProcessBuilder.Он обеспечивает лучший, более «объектно-ориентированный» API, чем простой Runtime.exec().

...