Java无法访问Windows注册表Registry

Windows的文件目录允许使用空格,导致我始终无法成功读取注册表信息

背景简述

公司在给国内某银行做一个普惠金融的项目,本人参与终端机器(C端)的监控系统开发,终端机(C端)开发人员将TerminalId这个信息存放在了注册表中,本人需要在程序中读取注册表信息。

原始代码

读取注册表代码


        try {  
            Process ps = null;  
            ps = Runtime.getRuntime().exec("reg query HKEY_LOCAL_MACHINE\\SOFTWARE\\Wincor Nixdorf\\ProTopas\\CurrentVersion\\SOPPARAM\\ATM_PARAM");  
            ps.getOutputStream().close();  
            InputStreamReader i = new InputStreamReader(ps.getInputStream());  
            String line;
            BufferedReader ir = new BufferedReader(i); 
            while ((line = ir.readLine()) != null) { 

                System.out.println(line);
            }  
        } catch (IOException e) {  
            e.printStackTrace();  
        }  

代码解释

通过java中Runtime.getRuntime().exec(“reg query  xxxxxxx”)方法可以执行reg query命令,读取注册表任意位置的信息

问题描述

采用上面的代码我能读取到注册表中很多位置的信息,但是就是无法读取到Wincor Nixdorf下面的信息。

解决方案

刚开始的时候我以为是注册表权限的问题,但是通过检查发现都拥有读的权限,最后我的目光被Wincor Nixdorf中间的空格吸引,我之前读成功的目录都是没有空格的,再联想到廖雪峰还是阮一峰痛骂Windows允许目录名称中可以使用空格这一行为,(linux下目录名是不允许有空格的),瞬间锁定了问题所在,最后经过测试就是这个空格导致的。


.exec("reg query HKEY_LOCAL_MACHINE\\SOFTWARE\\WincorNixdorf\\ProTopas\\CurrentVersion\\SOPPARAM\\ATM_PARAM");


这段代码简化为"reg query  xxx",xxx应该是注册表的目录,如果有空格这段命令就变成了 “reg query xxx xxx”,这样该命令的参数就不对了。

修改这行代码为:


.exec("reg query \"HKEY_LOCAL_MACHINE\\SOFTWARE\\WincorNixdorf\\ProTopas\\CurrentVersion\\SOPPARAM\\ATM_PARAM\"");


用双引号将注册表的位置参数引起来,再用转义字符转义双引号,问题轻松解决。

总结

Windows虽然允许目录中使用空格,但是没事别作死,命名不要用中文,不要用空格

参考文献

https://blog.csdn.net/baidu_18607183/article/details/51461290

文内如有错误,望批评指正,谢谢

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值