我正在开发一个Java程序,需要获取计算机序列号、CPU序列号等信息。在Windows系统中,使用WMI接口查询是获取这些信息最好的方式。通过命令行进行查询的标准方法是:
wmic bios get serialnumber
输出结果:
SerialNumber
WWV46RT609A3467173E
将其翻译为Java,我使用了Runtime.exec()和ProcessBuilder: (上面的注释Process p是我之前所做的)。这里,组件和项对应于上面命令中的“bios”和“serialnumber”。
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在两个操作系统上都可以正常工作。 我在这里读到,处理调用进程的标准输出和标准错误输出时会出现问题,因此需要调用redirectErrorStream()。
为什么它在Windows 7上无缺陷地工作,而在XP上失败了?除了生成一个单独的线程(也就是'StreamGobbler')之外,还有其他方法吗?(链接的示例相当古老,先于ProcessBuilder类及其redirectErrorStream()调用。)
ret = str.trim()
后需要加上break
,但我猜在 XP 上这个命令只会进入交互模式。 - bestsss