我目前正在开发一个java程序,我需要对注册表进行读/写。我看了几个API来做这件事,我找到了ini4j (ini4j Project Page)。我还需要编辑ini文件,所以我喜欢这个解决方案,因为它可以同时编辑这两个文件。我很好奇是否有人在这种情况下尝试过ini4j?
发布于 2011-08-05 21:58:02
我发现了一种读/写注册表的更好的解决方案,不需要ini4j或向命令行传递参数。我在我的程序中经常使用JNA,所以我认为使用本地库调用会更容易,而不是包含一个额外的库来为我做这件事。这是我的项目中的一个例子,我在注册表中搜索一个特定的键。特定密钥还取决于操作系统是x64还是x86。
public static String GetUninstallerPath() {
try {
//if (logger.IsInfoEnabled) logger.Info("GetUninstallerPath - begin");
String uninstallerPath = null;
try {
String vncDisplayName = "UltraVNC";
String subkey32 = "Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall";
String subkey64 = "Software\\Wow6432Node\\Microsoft\\Windows\\CurrentVersion\\Uninstall";
boolean is64Bit = Platform.is64Bit();
String[] key;
if (is64Bit) {
key = Advapi32Util.registryGetKeys(WinReg.HKEY_LOCAL_MACHINE,
subkey64);
} else {
key = Advapi32Util.registryGetKeys(WinReg.HKEY_LOCAL_MACHINE,
subkey32);
}
if (key != null) {
for (String nextSubkeyName : key) {
TreeMap<String, Object> subKey = Advapi32Util.registryGetValues(
WinReg.HKEY_LOCAL_MACHINE,
subkey64 + "\\" + nextSubkeyName);
Object value = subKey.get("DisplayName");
Object path = null;
if (value != null) {
if (value.toString().startsWith(vncDisplayName)) {
path = subKey.get("UninstallString");
if (path != null) {
uninstallerPath = path.toString().trim();
}
}
}
}
}
}
catch (Exception ex) {
System.err.println(ex.getMessage());
}
return uninstallerPath;
}
} 我最初使用对象来存储键值,因为我一直在获取NullPointerExceptions。请随时提供另一种解决方案。
发布于 2016-12-21 23:22:44
不幸的是,您使用Platform.is64Bit()对64位进行的测试并不像您认为的那样……
它告诉你JVM是32位还是64位,而不是你的Windows是32位还是64位……
代码看起来像预期的那样工作的唯一原因是因为Windows注册表重定向器会为您处理所涉及的“魔法”(访问正确的注册表项)……
当您的代码在64位Windows上的32位JVM上运行时,如果您使用的是subkey32 (即"Software\Microsoft\Windows\CurrentVersion\Uninstall"). ),Platform.is64Bit()将返回false
不幸的是,我和你犯了同样的错误,在阅读了像你这样的帖子后,我发布了一个带有相同错误测试的程序,这就是为什么我现在发布这个帖子,尽管这个帖子已经有好几年了。
https://stackoverflow.com/questions/6706979
复制相似问题