我目前在一个java程序工作,我需要读/写注册表。我看了几个API来做到这一点,我发现了ini4j (ini4j项目页面)。我还需要编辑ini文件,所以我喜欢这个解决方案,因为它兼而有之。我很好奇是否有人在这种情况下尝试过ini4j ?
我找到了一个更好的解决方案来读取/写入注册表,而不需要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;
}
}
我使用对象来初始存储键值,因为我不断获得nullpointerexception。请随意提供另一种解决方案。
遗憾的是,您使用Platform.is64Bit()对64位进行的测试没有达到您的预期…
它告诉你你的JVM是32位还是64位,而不是你的Windows是32位还是64位…
你的代码看起来像预期的那样工作的唯一原因是因为Windows注册表重定向器为你照顾了"魔法"所涉及的(访问正确的注册表项)…
当你的代码在64位Windows平台上的32位JVM上运行时。is64bit()返回false,你正在使用subkey32(即"SoftwareMicrosoftWindowsCurrentVersionUninstall")。
我不幸地和你犯了同样的错误,并在阅读线程后发布了一个具有相同错误测试的程序,例如你的线程,这就是为什么我现在发布这个,即使这个线程是几年前的