加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Windows > 正文

使用ProcessBuilder/Runtime.exec()启动的外部进程在XP上失败,适

发布时间:2020-12-14 02:21:26 所属栏目:Windows 来源:网络整理
导读:我正在开发一个 Java程序,它必须获取机器序列号,CPU序列号等.在Windows上,WMI接口是查询此类信息的最佳方式,使用命令行查询的标准方法是 wmic bios get serialnumber 产生输出: SerialNumberWWV46RT609A3467173E 将其转换为Java,我使用了Runtime.exec()和Pr
我正在开发一个 Java程序,它必须获取机器序列号,CPU序列号等.在Windows上,WMI接口是查询此类信息的最佳方式,使用命令行查询的标准方法是

wmic bios get serialnumber

产生输出:

SerialNumber
WWV46RT609A3467173E

将其转换为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);

此代码段在Windows 7上完美运行,但在Windows XP上挂起.使用命令行中的wmic可以在两个操作系统上运行.
我读了here,处理被调用进程的stdout和stderr都有问题,因此调用了redirectErrorStream().

为什么它在Windows 7上完美运行但在XP上失败?有没有办法产生一个单独的线程,又名’StreamGobbler‘? (链接的示例非常古老,早于ProcessBuilder类,其redirectErrorStream()调用.

解决方法

我希望你现在已经解决了这个问题.如果没有,这就是你需要做的.首先,我也遇到了同样的问题,并发现它是bufferedReader问题.它陷入僵局,导致windows xp挂起.解决方案是通过在命令附加“< NUL”来模拟缓冲重构器的行尾(eof).

String[] command = {"CMD","/C","WMIC COMPUTERSYSTEM GET USERNAME <NUL "} and executing this command.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读