使用Runtime.exec()运行java程序?

时间:2014-03-18 17:25:20

标签: java ide console command-prompt runtime.exec

我正在创建一个Java IDE应用程序,并且在运行用户代码时遇到了问题。目前我正在使用Runtime.exec()编译,然后在使用InputStream和ErrorStream生成输出时运行程序。如果程序永远不会停止要求用户输入,那么哪个工作正常。在这种情况下,程序将崩溃并且不显示任何输出。我想这是因为读者不会读取输出,直到程序运行完毕。

我尝试过使用线程来解决这个问题,但没有成功。有没有办法在运行时暂停程序以允许用户输入,还是有其他方法可以创建控制台来运行用户代码?

2 个答案:

答案 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) {}