Rex*_*Rex 6 java windows windows-xp process
我正在开发一个Java程序,它必须获取机器序列号,CPU序列号等.在Windows上,WMI接口是查询此类信息的最佳方式,使用命令行查询的标准方法是
wmic bios get serialnumber
Run Code Online (Sandbox Code Playgroud)
产生输出:
SerialNumber
WWV46RT609A3467173E
Run Code Online (Sandbox Code Playgroud)
将它翻译成Java,我使用了Runtime.exec()和ProcessBuilder,如下所示:(评论过程p是我之前做过的).这里,component和item对应于上面命令行中的'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);
Run Code Online (Sandbox Code Playgroud)
此代码段在Windows 7上完美运行,但在Windows XP上挂起.使用命令行中的wmic可以在两个操作系统上运行.我在这里读到处理被调用进程的stdout和stderr时出现问题,因此调用了redirectErrorStream().
为什么它在Windows 7上完美运行但在XP上失败?有没有办法产生一个单独的线程,又名' StreamGobbler '?(链接的示例非常古老,早于ProcessBuilder类,其redirectErrorStream()调用.
小智 7
我希望你现在已经解决了这个问题.如果没有,这就是你需要做的.首先,我也遇到了同样的问题,并发现它是bufferedReader问题.它陷入僵局,导致windows xp挂起.解决方案是通过附加"<NUL"命令来模拟bufferedreader的行尾(eof).
String[] command = {"CMD", "/C", "WMIC COMPUTERSYSTEM GET USERNAME <NUL "} and executing this command.
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3102 次 |
| 最近记录: |