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