加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Windows > 正文

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

发布时间:2020-12-13 19:25:32 所属栏目:Windows 来源:网络整理
导读:我有一个 Java应用程序从Preferences中读取: Preferences prefs = Preferences.userNodeForPackage(MyClass.class);prefs.get((String)key,""); 在一台新的Windows 8机器上,失败: WARNING: Could not open/create prefs root node SoftwareJavaSoftPrefs
我有一个 Java应用程序从Preferences中读取:
Preferences prefs = Preferences.userNodeForPackage(MyClass.class);
prefs.get((String)key,"");

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

WARNING: Could not open/create prefs root node SoftwareJavaSoftPrefs 
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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读