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

Запуск внешней программы

запуск внешней программы в Java осуществляется вызовом метода Runtime exec(String[] command,String[] env);. Передача параметрF массивом нужна, что того чтобы с ними было меньше проблем, например с пробелами. Ожидание завершения программы производится вызовом метода int waitFor(0) и мы получаем возвращаемое процессом значение. Так же есть методы:

Итого код примера:

String cmd = {"cat","--help"};
Process pCat = System.getRuntime().exec(cmd);
pCat.waitFor();

Перенаправление потока внешней программы

Часто перед нами стоит задача получение доступа к потокам ввода-вывода программы. Это делается следующими методами:

Метод Возвращаемый тип что такое
getOutputStream OutputStream поток ввода программы (stdin)
getInputStream InputStream поток вывода программы(stdout)
getErrorStream InputStream поток ошибок программы(stderr)

NOTE Да, названия методов немного не логичны.

Пример получения потоков:

stdin = pCat.getOutputStream();
stdout = pCat.getInputStream();
stderr = pCat.getErrorStream();

String line =”hello world” + “\n”;
stdin.write(line.getBytes()); //отправляем данные программе
stdin.flush();
stdin.close();

BufferedReader outReader = new BufferedReader(new InputStreamReader(stdout));
while ((line = outReader.readLine ()) != null) { //считываем поток выхода
    System.out.println (line);
}
outReader.close();

BufferedReader errReader = new BufferedReader(new InputStreamReader(stderr));
while ((line = errReader.readLine ()) != null) { //считываем поток ошибок
    System.out.println (“[Stderr] ” + line);
}
errReader.close();

Замечу, что в данной программе есть налог клавиши ctrl+D это stdin.close(); =)




comments powered by Disqus