我正在创建一个Java IDE应用程序,并且在运行用户代码时遇到了问题。目前我正在使用Runtime.exec()编译,然后在使用InputStream和ErrorStream生成输出时运行程序。如果程序永远不会停止要求用户输入,那么哪个工作正常。在这种情况下,程序将崩溃并且不显示任何输出。我想这是因为读者不会读取输出,直到程序运行完毕。
我尝试过使用线程来解决这个问题,但没有成功。有没有办法在运行时暂停程序以允许用户输入,还是有其他方法可以创建控制台来运行用户代码?
答案 0 :(得分:0)
我认为这是因为读者不会读取输出,直到程序运行完毕。
我不知道你将如何得到这个过程,等待"直到用户输入被写入流程的输出流,但我可以帮助您澄清一些事情。
我知道读者肯定不会等到程序运行完毕才能读取输出流。
LoggingProcessWrapperUtil.myPB = new ProcessBuilder(command);
LoggingProcessWrapperUtil.myPB.redirectInput(Redirect.PIPE);
LoggingProcessWrapperUtil.myPB.redirectOutput(Redirect.PIPE);
StringBuilder commandStr = new StringBuilder();
for (String str : command) {
commandStr.append(str);
commandStr.append(" ");
}
LoggingProcessWrapperUtil.log.debug("Executing command : {}", commandStr);
Process p = LoggingProcessWrapperUtil.myPB.start();
LoggingProcessWrapperUtil.log.debug("Starting ProcessStreamWorker pointed at process");
for (String str : args_to_write_on_stream) {
LoggingProcessWrapperUtil.log.debug("Writing arguments on inbound outputstream:");
LoggingProcessWrapperUtil.log.debug(str);
}
ProcessStreamWorker w = new ProcessStreamWorker(p, args_to_write_on_stream);
new Thread(w).start();
int exitCode = w.waitOn(timeoutMS);
SimpleEntry<Integer, String> returnEntry = new SimpleEntry<Integer, String>(exitCode,
w.getAggregateOutput());
return returnEntry;
这个简短的片段是我对相关问题的解决方案,虽然我希望自动化一个过程,而不是暂停用户输入。我构建了流程,启动它,然后立即将它放入一个可运行的流程包装器中,该流程包装器将参数附加到流程的OutputStream上。这对我有用,因此进程输出流肯定会实时读取。
您可以尝试的一件事是ProcessBuilder.redirectInput和ProcessBuilder.redirectOutput(Redirect.Inherit),如果您有一个CLI java应用程序启动另一个CLI应用程序,那么您启动的进程也应接受来自控制台的输入/输出活动主应用程序正在运行的窗口。
答案 1 :(得分:0)
如果您希望有另一种方法可以满足您的要求。 您可以重定向进程的输入流(此代码需要jdk 1.7):
try {
ProcessBuilder pb = new ProcessBuilder("cmd");
pb.redirectErrorStream(true); // merge output and error streams
pb.redirectInput(ProcessBuilder.Redirect.from(System.in));
pb.redirectOutput(ProcessBuilder.Redirect.to(System.out));
Process p = pb.start();
int exitValue = p.waitFor();
System.out.println("Process Completed with exit value of " + exitValue);
} catch (java.io.IOException ex) {
} catch (InterruptedException ex) {}