Я в настоящее время создаю инструмент разработки графического интерфейса Firefox с помощью Java. Однако я застреваю при попытке получить вывод файла .bat
.Runtime.getRuntime не удалось получить вывод в то же время, но позже
Когда я запускаю файл .bat
с помощью java, я могу видеть результат, но в файле bat есть 3 команды. Когда выполняется первая команда, я могу получить вывод одновременно. Но когда он выполняет второй вывод команды, он не подходит. И когда существует файл .bat
, я получаю весь вывод, который не приходил одновременно.
Я получаю выход сразу после его выполнения:
call "C:\mozilla-build\addon-sdk-1.16\bin\activate.bat
Но я не получаю выход одновременно для следующей команды:
call cfx run
Но я знаю, что это исполнение, потому что окно светлячок всплывает , Я получаю все выходные внезапно, когда я исполняю proc.destroy();
Это моя летучая мышь файл:
@echo off
call %1
cd C:\Users\Madhawa.se\Desktop\workingfox\beauty
call cfx run
pause
Это мой Java-код:
Thread t = new Thread(new Runnable() {
@Override
public void run() {
try {
Runtime rt = Runtime.getRuntime();
String[] commands = {"C:\\Users\\Madhawa.se\\Desktop\\workingfox\\runner\\foxrun.bat", "C:\\mozilla-build\\addon-sdk-1.16\\bin\\activate.bat"};
proc = rt.exec(commands);
BufferedReader stdInput = new BufferedReader(new InputStreamReader(proc.getInputStream()));
BufferedReader stdError = new BufferedReader(new InputStreamReader(proc.getErrorStream()));
// read the output from the command
String s = null;
while ((s = stdInput.readLine()) != null) {
System.out.println(s);
}
// read any errors from the attempted command
while ((s = stdError.readLine()) != null) {
System.out.println(s);
}
proc.waitFor();
System.out.println("success");
} catch (Exception ex) {
ex.printStackTrace();
}
}
});
t.start();
Как сразу получить выход и почему он действует по-разному для этой команды?
Выход буферизуется и может остаться в буфере, пока ваш пакетный файл висит в команда 'pause', которая ждет ввода клавиатуры. Но кроме того, я рекомендую использовать ['ProcessBuilder'] (http://docs.oracle.com/javase/7/docs/api/java/lang/ProcessBuilder.html) вместо' Runtime.exec'. Используя ['inheritIO()'] (http://docs.oracle.com/javase/7/docs/api/java/lang/ProcessBuilder.html#inheritIO()), вы можете пропустить весь «прочитанный канал и копию» в stdout ". Вы можете просто сказать «новый ProcessBuilder (команды) .inheritIO(). Start(). WaitFor()'. – Holger