使用 ProcessBuilder/Runtime.exec() 启动的外部进程在 XP 上失败,但在 Win 7 上工作
我正在开发一个Java程序,它必须获取机器序列号、CPU序列号等。在Windows上,WMI接口是查询此类信息的最佳方法,使用命令行查询的标准方法是
wmic bios get serialnumber
生成输出:
SerialNumber
WWV46RT609A3467173E
将其翻译成 Java,我使用了 Runtime.exec() 和 ProcessBuilder,如下所示: (注释的 Process p 是我之前所做的)。这里,组件和项目对应于上面命令行中的“BIOS”和“序列号”。
String ret = "";
ProcessBuilder pb = new ProcessBuilder("wmic", component, "get", item);
pb.redirectErrorStream(true);
// Process p = Runtime.getRuntime().exec(
// "wmic " + component + " get " + item);
Process p = pb.start();
InputStreamReader isr = new InputStreamReader(p.getInputStream());
BufferedReader input = new BufferedReader(isr);
String str;
while ((str = input.readLine()) != null) {
if (str.equalsIgnoreCase(item) || StringUtils.isBlank(str)) {
continue;
}
ret = str.trim();
}
input.close();
isr.close();
System.out.println(ret);
此代码片段在 Windows 7 上完美运行,但在 Windows XP 上挂起。从命令行使用 wmic 适用于两种操作系统。 我在此处读到,处理 stdout 和 stderr 时存在问题被调用的进程,因此redirectErrorStream() 调用。
为什么在 Windows 7 上可以完美运行,但在 XP 上却失败?除了生成一个单独的线程(又名 'StreamGobbler'? (链接的示例非常古老,早于 ProcessBuilder 类及其redirectErrorStream() 调用。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
我希望您现在已经解决了这个问题。如果没有,这就是您需要做的。首先,我也遇到了同样的问题,并发现这是 bufferedReader 问题。它陷入了死锁情况,导致 windows xp 挂起。解决方案是通过在命令中附加“
I hope that you have by now got a resolution to this issue. If not, this is what you need to do. First, I also encountered with the same issues and came to discover that it is bufferedReader issue. It is gets into a deadlock situation that resulting into windows xp hanging. The solution is to simulate the end of line (eof) to the bufferedreader by appending
"<NUL"
the the command.您必须使用线程来捕获输出(标准和错误)。
您还可以查看这个 Apache 库。
You have to use threads to capture ouputs (standard & error).
You can also take a look at this Apache library.