我需要在Java(Windows)中编写一个应用程序,该应用程序将使用-P参数运行pgbench命令并从控制台读取输出。
我写了.bat文件“ windowsPostgr.bat”:
设置“ PGUSER = postgres”设置“ PGPASSWORD = postgres” pgbench -c 1 -f C:/work/EasySQL.sql -j 1 -t 1500 -P 1 -U postgres mydb
我的代码:
String cmd = "cmd /c C:\\windowsPostgr.bat";
Process process = Runtime.getRuntime().exec(cmd);
try {
BufferedReader reader =
new BufferedReader(new InputStreamReader(process.getInputStream()));
String line;
while ((line = reader.readLine()) != null) {
System.out.println(line);
}
int exitCode = process.waitFor();
System.out.println("\nExited with error code : " + exitCode);
} catch (IOException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
结果,当在cmd中运行jar时,仅显示所得的pgbenh信息:
交易类型:自定义查询比例因子:1查询模式:简单 客户端数量:1线程数量:1每个事务数量 客户:1500实际处理的交易数:1500/1500 平均延迟时间:11.181毫秒延迟标准偏差:1.200毫秒tps = 89.073332 (包括建立连接)tps = 89.404427(不包括 建立连接)
因此,当通过句柄启动windowsPostgr.bat时,将显示以下形式的其他信息(由于-P参数):
进度:1.0 s,76.8 tps,纬度12.147 ms stddev 1.356
进度:2.0 s,84.1 tps,纬度11.864 ms stddev 1.034等
实际上是一个问题:从IDEA或jar运行WindowsPostgr.bat时如何显示其他信息?并且reader.readLine()会读取并显示此信息吗?
答案 0 :(得分:1)
您没有从Java中读取的其他信息实际上会打印到stderr,而不是stdout,这就是为什么您不读取它的原因。
如果需要此信息,则必须使用getErrorStream()
捕获过程的标准错误。
编辑:请阅读:Java Process with Input/Output Stream
使用ProcessBuilder
而不是Runtime.getRuntime().exec(cmd)
来启动您的过程甚至更容易,只需使用builder.redirectErrorStream(true);
将错误流重定向到输出流即可。这样,您将以正确的顺序获得一切。