Кажется, что проблема возникает из-за выхода exe, который слишком длинный. Может ли ProcessBuilder решить эту проблему?
Как общее правило, вы должны всегда читать вывод Process
перед вызовом waitFor
(или использовать фоновый Thread
, чтобы прочитать его, пока вы waitFor
)
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
public class PBDemo {
public static void main(String[] args) throws Exception {
String s;
ProcessBuilder pb = new ProcessBuilder("myexe.exe");
pb.redirectErrorStream(true);
try {
Process pro = pb.start();
InputConsumer ic = new InputConsumer(pro.getInputStream());
System.out.println("...Waiting");
int exitCode = pro.waitFor();
ic.join();
System.out.println("Process exited with " + exitCode);
} catch (Exception e) {
System.out.println("sorry" + e);
e.printStackTrace();
}
}
public static class InputConsumer extends Thread {
private InputStream is;
public InputConsumer(InputStream is) {
this.is = is;
start();
}
@Override
public void run() {
try {
int in = -1;
while ((in = is.read()) != -1) {
System.out.print((char) in);
}
} catch (IOException exp) {
exp.printStackTrace();
}
}
}
}
В прошлом я либо предоставил Observer Pattern на номер InputConsumer
, через который какая-либо другая сторона может быть уведомлена по мере ввода нового ввода или другого кэширования вывода, чтобы я мог обработать его после завершения процесса в соответствии с вашими потребностями.
Разве это не зависит от вашей программы myexe.exe? –
Не могли бы мы получить дополнительную информацию об EXE, которую вы пытаетесь запустить, и полную ошибку? –
Я бы использовал 'ProcessBuilder' и перенаправил ошибку ввода-вывода через stdout, а затем попробовал и прочитал ответ – MadProgrammer