Есть две зависимые от системы вещи.
Прежде всего, вы ожидаете завершения процесса с помощью p.waitFor()
, прежде чем читать вывод программы. Это может навсегда заблокировать, когда емкость канала исчерпана, поскольку программа может завершиться, только когда она записала все свои выходные данные. Фактическая пропускная способность трубы зависит от системы и не указана.
Кроме того, поскольку предоставление аргументов не является ошибочной ситуацией, может случиться так, что сообщение было записано в поток ошибок вместо стандартного вывода. В этом случае вам придется читать p.getErrorStream()
вместо p.getInputStream()
(в моей системе это было не так).
Итак, вы можете попробовать
Runtime rt = Runtime.getRuntime();
try {
String cmd = "javac";
// OR String cmd = "cmd /c javac";
// OR String cmd = "java -cp myjar com.my.sample";
Process p = rt.exec(cmd);
BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream()));
String line;
while ((line = br.readLine()) != null) {
System.out.println(line);
}
p.waitFor();
} catch(Exception e){
e.printStackTrace();
}
И если он завершается без печати чего-либо, попробуйте p.getErrorStream()
вместо p.getInputStream()
.
Но если вы просто хотите распечатать вывод подпроцесса на консоль, вы можете сделать это намного лучше:
try {
String cmd = "javac";
// OR String cmd = "cmd /c javac";
// OR String cmd = "java -cp myjar com.my.sample";
Process p = new ProcessBuilder(cmd).inheritIO().start();
p.waitFor();
} catch(Exception e){
e.printStackTrace();
}
Это соединяет ваши входные и выходные каналы с входными и выходными каналами подпроцесса. Поэтому вам не нужно обрабатывать трубу для этого случая.
Но если вы действительно хотите обработать вывод в вашей программе, то есть печать была только примером, ProcessBuilder
по-прежнему имеет интересную опцию:
try {
String cmd = "javac";
// OR String cmd = "cmd /c javac";
// OR String cmd = "java -cp myjar com.my.sample";
Process p = new ProcessBuilder(cmd).redirectErrorStream(true).start();
BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream()));
String line;
while ((line = br.readLine()) != null) {
System.out.println(line);
}
p.waitFor();
} catch(Exception e){
e.printStackTrace();
}
Используя redirectErrorStream(true)
, вы указываете ему записывать любой вывод ошибок в тот же канал, что и стандартный вывод, так что обрабатывается только один выход.