为什么我在进程终止后才得到进程的输出?我需要在进程运行时而不是在进程终止后“实时”获取进程输出。我想运行一个像 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/