java - 从 java 执行外部进程。进程终止后得到输出,但在终止前需要它

标签 java process live execution

为什么我在进程终止后才得到进程的输出?我需要在进程运行时而不是在进程终止后“实时”获取进程输出。我想运行一个像 jboss 这样的进程,它记录标准输出,所以我需要及时的信息,而不是在进程终止之后。谢谢您的解答。

这是我的代码:

        try {
        process = processBuilder.start();
        processOutput = process.getOutputStream();
        processInput = process.getInputStream();
        processReader = new BufferedReader(new InputStreamReader(
                processInput));
        processWriter = new BufferedWriter(new OutputStreamWriter(
                processOutput));

        while ((line = processReader.readLine()) != null) {
            System.out.println(line);
          }
        processReader.close();

    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

扩展名:

所以我想用一个按钮从 Eclipse 插件运行一个外部程序。当我单击按钮时,程序启动,外部程序的输出将返回到控制台。当我点击停止时,程序停止。这就是我如何创建流程构建器的实例。我制作了一个示例类来测试流程构建器,而无需在每次修改中启动整个插件项目。

这是我的流程构建器实例,它实现了 Runnable:

@Override
public void run() {
    List<String> command = new ArrayList<String>();
    command.add(serverPath);
    command.add(String.valueOf(count));
    command.add(filePath);
    processBuilder = new ProcessBuilder(command);
    processBuilder.redirectErrorStream(true);

    try {
        process = processBuilder.start();
        processOutput = process.getOutputStream();
        processInput = process.getInputStream();
        processReader = new BufferedReader(new InputStreamReader(
                processInput));
        processWriter = new BufferedWriter(new OutputStreamWriter(
                processOutput));

        System.out.println(process.waitFor());
        while ((line = processReader.readLine()) != null) {
            System.out.println(line);

        }
        processReader.close();

    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

}

参数来自构造函数。这是实例化:

public static void main(String[] args) throws Exception

{

 SimulationProcess smp = new SimulationProcess(count, "file",
            "program_name");
    smp.run();

}

最佳答案

您可以尝试以下几种方法来解决您的问题:

a) 制作一个测试程序并使用上面的代码运行它以确保您可以正确阅读它。例如:

public static void main(String[] args) {
  for(;;) {
    try {
      Thread.sleep(5000);
      System.out.println("Test output");
    } catch(InterruptedException e) {
      // Ignore
    }

  }
}

b) 确保您正在处理进程的错误流 - 如果您不处理错误流,进程可能会锁定。看this site有关使用 Java 的 ProcessBuilder 或 Runtime.exec() 时应避免的事项的教程 - 它包含 StreamGobbler 的实现,它将丢弃您不关心的流上的所有数据。

c) 尝试使用 System.out.flush() - 可能您的输出正在被缓冲。

编辑:感谢您的更新。您的问题在这里:

System.out.println(process.waitFor()); // Waits for the process to exit.
while ((line = processReader.readLine()) != null) {
    System.out.println(line);
}

如果删除 waitFor(),它将继续打印,直到流关闭。仅当进程终止时流才应关闭。您应该将 waitFor() 放在循环后面吗?

关于java - 从 java 执行外部进程。进程终止后得到输出,但在终止前需要它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6741759/

相关文章:

java - 如何在 Java 中比较字符串?

linux - 程序到进程的转换

css - AdSense - 在窗口大小调整时调整响应式广告拦截的大小

java - Pubnub 无法在 Google App Engine (GAE) 上运行

java - ContentPane 在 Eclipse IDE 中的设计时不会调整大小

Java Junit 测试问题

php - 在 Apache/PHP 中,如何运行一个独立的进程,并在 linux 上重启 apache 后继续存在

silverlight - 为什么我在 System.Diagnostics silverlight 项目 VS 2010 中找不到进程类

video-streaming - 树莓派无延迟(<10ms)视频流

javascript - 什么替代方案最适合间隔页面重新加载?