【问题标题】:Using java.lang.ProcessBuilder使用 java.lang.ProcessBuilder
【发布时间】:2011-03-18 08:20:16
【问题描述】:

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

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

但该过程永远不会开始,也不会打印任何错误。但是如果我添加以下行:

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

之后:处理过程 = 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 "";
    }   }

运行良好!有什么想法吗?

【问题讨论】:

  • 您是否需要使用标准输入/输入流与该进程通信?

标签: eclipse process


【解决方案1】:

如果它真的是一个批处理文件,你应该以该文件作为参数运行命令行解释器作为进程(例如 cmd.exe)。

【讨论】:

  • 你的意思是这样的吗:ProcessBuilder pb = new ProcessBuilder( "cmd", "/c", "mybat.bat", "param 1", "param 2", "param 3" );我已经尝试过了,但它给出了相同的结果。
  • 您如何检查进程是否正在运行、ProcessExplorer、Java 控制台?
【解决方案2】:

在这里解决:

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

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

链接到的文章演示了一种从流中读取的方法。不过,关键的要点是您必须不断读取子进程的输出/错误,以防止它因 I/O 阻塞而挂起。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-05-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-06
    • 1970-01-01
    • 2016-03-23
    • 2015-09-08
    • 2020-12-19
    相关资源
    最近更新 更多