当前位置: 首页 > 面试题库 >

Java:java.util.Preferences失败

叶俊郎
2023-03-14
问题内容

我的程序使用java.util.Preferences该类(系统偏好设置,而不是用户)将加密的产品密钥数据保存到html" target="_blank">计算机。问题是,在Windows和Linux上(尚未在OSX上进行测试,但可能是相同的),如果我不使用sudo具有管理员权限的程序运行该程序,则在尝试读取或读取该程序时,它将发出异常或警告。保存数据。

显然,要求用户以“管理员”权限运行程序是不切实际的。理想情况下,我希望操作系统请求用户许可。

这很愚蠢,并且消除了的一半目的Preferences。如何解决?

这是我所需要的摘要 :我需要我的程序来请求操作系统的许可来保存系统设置。

这是错误信息

这是当我尝试读取节点时的错误(因为该节点不存在):

Mar 18, 2011 9:41:15 AM java.util.prefs.WindowsPreferences <init>
WARNING: Could not create windows registry node Software\JavaSoft\Prefs\myapp at root 0x80000002. Windows RegCreateKeyEx(...) returned error code 5.
Mar 18, 2011 9:41:15 AM java.util.prefs.WindowsPreferences WindowsRegOpenKey1
WARNING: Trying to recreate Windows registry node Software\JavaSoft\Prefs\myapp at root 0x80000002.
Mar 18, 2011 9:41:15 AM java.util.prefs.WindowsPreferences openKey
WARNING: Could not open windows registry node Software\JavaSoft\Prefs\myapp at root 0x80000002. Windows RegOpenKey(...) returned error code 2.
Mar 18, 2011 9:41:15 AM java.util.prefs.WindowsPreferences WindowsRegOpenKey1
WARNING: Trying to recreate Windows registry node Software\JavaSoft\Prefs\myapp\subpackage at root 0x80000002.
Mar 18, 2011 9:41:15 AM java.util.prefs.WindowsPreferences openKey
WARNING: Could not open windows registry node Software\JavaSoft\Prefs\myapp\subpackage at root 0x80000002. Windows RegOpenKey(...) returned error code 2.

这就是当我尝试写入节点时发生的情况:

Mar 18, 2011 9:43:11 AM java.util.prefs.WindowsPreferences WindowsRegOpenKey1
WARNING: Trying to recreate Windows registry node Software\JavaSoft\Prefs\myapp\subpackage at root 0x80000002.
Mar 18, 2011 9:43:11 AM java.util.prefs.WindowsPreferences openKey
WARNING: Could not open windows registry node Software\JavaSoft\Prefs\myapp\subpackage at root 0x80000002. Windows RegOpenKey(...) returned error code 2.

问题答案:

不幸的是,您在这里得到的大多数答案都是错误的……至少是错误的。从某种意义上说是在治疗症状,而不是原因。

让我们回顾一下。Java
Preferences有两个“树”:用户树和系统树。您可以将自己的后端编写到Java
Preferences(称为后备存储),但很少有开发人员这样做,因此最终得到了JDK的默认后备存储。在Windows平台上,这表示Win注册表,更具体地说:

  • 用户树 被写入HKEY_CURRENT_USER\Software\JavaSoft\Prefs(操作系统用户 总是 有写访问这里)
  • 系统树 被写入HKEY_LOCAL_MACHINE\Software\JavaSoft\Prefs(仅管理员PRIVS操作系统的用户有写权限这里)

总结:只要您的代码不尝试使用系统树,您就可以了,也不必在操作系统级别上分配特权。系统树适用于“主机上的所有用户”,而用户树适用于特定的登录用户。对于您的情况,我相信您可以满足用户树的需要,因此这确实是您的解决方案。不要搞乱特权,以管理员身份运行,否则就不行。

....但还有更多。假设您的代码没有按照指示触及Java Preferences系统树。然后,您 仍然 会在Windows上看到此警告:

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

那么发生了什么?我给你错了建议吗?并不是的。跟我在一起。

深入研究JDK源代码,您将看到0x80000002表示HKLM,即Win
Registry中不应被触摸的位置。您的代码从不引用系统树,但是您仍然看到此警告!(在这一点上,您必须像我一样把所有的头发都扯掉。)

嗯,这是真正的JDK错误的罕见情况之一。您可以在我的答案中阅读更多有关此内容的信息,如果您对为什么多年来无法在JDK中检测到细微的错误感兴趣,我建议您阅读。该错误自JDK
1.4起就存在,但直到最近才得到修复,尚未反向移植到JDK 8。

最佳建议

  • 确保您的代码仅引用用户树,而不引用系统树。公平的是,操作系统要求您提供所有类型的privs才能写入系统范围的位置。如果您 确实 需要写到这样的位置,那么除了分配priv,以管理员身份执行或没有其他操作之外,实际上没有别的解决方案。
  • 忽略警告。一旦使用Java 9或Oracle决定将错误修复程序移植到Java 8中,它将消失。警告可以放心地忽略。
  • 或者,您可以尝试以编程方式忽略该警告。它来自JDK的Platform Logger,所以这样的事情应该可以工作,尽管我自己还没有尝试过:
        sun.util.logging.PlatformLogger platformLogger = PlatformLogger.getLogger("java.util.prefs");
    platformLogger.setLevel(PlatformLogger.Level.OFF);


 类似资料:
  • 我尝试运行这个gradle任务(通过gradlew) 它使用cucmber jvm 并收到此错误 当我从cmd中的同一路径运行同一行时: 更新1: 这个cmd在shell控制台中工作: ./构建/发行版/WebLarge测试/bin/WebLargeTests-f html:构建/报告/cucumber/-f json:构建/报告/cucumber/report.json--胶水com.waze.

  • 在两台不同的笔记本电脑上使用maven构建相同的项目。一个是运行良好,一个是显示错误。 状态:两个系统的配置相同。 使用的命令:mvn clean install-DskipTests=true 错误: 我什至尝试删除所有内容,例如再次创建. m2文件夹。

  • 问题内容: 当我使用getFromLocationName调用时,我得到一个IOException,描述为“ grpc failed”。 运行的代码 错误的控制台输出: Android SDK版本(API级别):25 Android Studio插件是最新的。 提前致谢! 编辑: 问题现在似乎已经解决,这是我的解决方案。 问题答案: 更新: 该问题现在似乎已解决。我不确定问题是否就此解决了,因此,

  • 我写了一个方便的屏幕键盘模块,当我在电脑上编写打算以平板模式运行的程序时,我可以导入和使用它。因为我想在未来的许多程序中导入和使用这个实用程序,我想存储当前鼠标位置和在模块开始时鼠标可见性状态,然后在模块退出时恢复那些条件。mouse.get_pos()命令工作正常,但是.mouse.get_visible()命令失败,返回错误消息:AtiniteError:模块'pygame.mouse'没有属

  • 我正在尝试构建我的Android应用程序与Gradle在控制台。但关于任务“:app:TransformClasseSandResourcesWithProGuardForRelease”的获取以下错误: ./gradlew构建--堆栈跟踪 这是我收到的例外情况: