新鲜的Windows 8中,从/到Java首选项的阅读和写入失败,

我有一个 Java应用程序从Preferences中读取:
Preferences prefs = Preferences.userNodeForPackage(MyClass.class);
prefs.get((String)key,"");

在一台新的Windows 8机器上,失败:

WARNING: Could not open/create prefs root node Software\JavaSoft\Prefs 
at root 0x80000002. Windows RegCreateKeyEx(...) returned error code 5.

错误代码5访问被拒绝.

我找不到我做错了什么Google和SO搜索提供仅与Windows Vista / 7相关的旧结果,其中一个错误地使用systemRoot(How can I write System preferences with Java? Can I invoke UAC?).

通过创建HKLM / Software / JavaSoft / Prefs并将权限设置为HKLM / Software / JavaSoft可以“修复”错误,这里提到这里Java: java.util.Preferences Failing.但这不是我可以要求我的用户在安装程序时要做的事情.

所以我正在寻找一个更好的解决方案.我最后一次的努力是简单的写档案,但我想避免这种情况.这也似乎与I’m trying to use Java Prefences from XML WITHOUT using Windows registry,but I see a Registry-related message相关,但是没有答案就被投票了.

目前我怀疑一个Win8 JVM的bug …

问题

>有人知道一个不涉及写文件解决方案吗?
>为什么Windows 7中相同的代码可以正常工作,但是在Windows 8中可以惨败?

我最近开始注意到同样的警告,认为这意味着注册表不能写.但是经过仔细的检查,我注意到HKEY_CURRENT_USER中成功更新的所有偏好.所以我很好奇为什么我看到这个警告.

原来,罪魁祸首是这个静态成员变量:WindowsPreferences.systemRoot

看起来Java尝试初始化WindowsPreferences.systemRoot,以防程序稍后使用,如果程序未以管理员身份运行,那么初始化显然会失败.

由于您使用Preferences.userNodeForPackage(),您将永远不需要systemRoot,因此您可以安全地忽略该警告.

当然,这是一个可怕的做法,Java尝试在没有请求时初始化systemRoot.

更新:我在各种Java版本中测试了这个问题,并得出结论,这个错误是在Java 1.7.0_21中引入的.它在Java 1.7.0_17中工作正常,只是因为该版本的安装程序将在注册表中创建“Pref”文件夹!当然,即使在该版本中,如果要从注册表中删除“Pref”,那么它将停止工作,所以这是Oracle开始的一个愚蠢的解决方案.我将填写错误报告.

更新2:警告消息不是一个错误.这似乎是预期的行为:http://bugs.java.com/bugdatabase/view_bug.do?bug_id=6809488

相关文章

Windows2012R2备用域控搭建 前置操作 域控主域控的主dns:自...
主域控角色迁移和夺取(转载) 转载自:http://yupeizhi.blo...
Windows2012R2 NTP时间同步 Windows2012R2里没有了internet时...
Windows注册表操作基础代码 Windows下对注册表进行操作使用的...
黑客常用WinAPI函数整理之前的博客写了很多关于Windows编程的...
一个简单的Windows Socket可复用框架说起网络编程,无非是建...