使用java.lang.ProcessBuilder

时间:2011-03-18 08:20:17

标签: eclipse process

从java应用程序中运行一个启动另一个java应用程序的bat文件:

  ProcessBuilder processBuilder = new ProcessBuilder("path to bat file");
  Process process = processBuilder.start();

但是这个过程永远不会开始,也不会打印错误。但如果我添加一行:

  String resultString = convertStreamToString(process.getInputStream());

after:Process process = processBuilder.start();

其中:

  public String convertStreamToString(InputStream is) throws IOException {
    /*
     * To convert the InputStream to String we use the Reader.read(char[]
     * buffer) method. We iterate until the Reader return -1 which means there's
     * no more data to read. We use the StringWriter class to produce the
     * string.
     */
    if (is != null) {
      Writer writer = new StringWriter();
      char[] buffer = new char[1024];
      try {
        Reader reader = new BufferedReader(new InputStreamReader(is, "UTF-8"));
        int n;
        while ((n = reader.read(buffer)) != -1) {
          writer.write(buffer, 0, n);
        }
      } finally {
        is.close();
      }
      return writer.toString();
    } else {
      return "";
    }   }
它运行正常!有什么想法吗?

2 个答案:

答案 0 :(得分:0)

如果它确实是批处理文件,则应将命令行解释程序作为进程运行(例如cmd.exe),并将该文件作为参数。

答案 1 :(得分:0)

解决方案:

Starting a process with inherited stdin/stdout/stderr in Java 6

但是,仅供参考,该协议是子流程具有有限的输出缓冲区,因此如果您不从中读取它们,它们会等待写入更多IO。您在原始帖子中的示例通过继续从进程的输出流中读取正确解决此问题,因此它不会挂起。

链接到文章演示了一种从流中读取的方法。关键的外卖概念是,您必须继续从子进程读取输出/错误,以防止由于I / O阻塞而挂起。