java - 无法从 Java 将布尔首选项存储到 Windows 10 注册表,而整数和字符串已正确存储
问题描述
我正在使用https://www.vogella.com/tutorials/JavaPreferences/article.html中的示例和以下代码:
import java.util.prefs.Preferences;
public class PreferenceTest {
private Preferences prefs;
public void setPreference() {
// This will define a node in which the preferences can be stored
prefs = Preferences.userRoot().node(this.getClass().getName());
String ID1 = "Test1";
String ID2 = "Test2";
String ID3 = "Test3";
// First we will get the values
// Define a boolean value
System.out.println(prefs.getBoolean(ID1, true));
// Define a string with default "Hello World
System.out.println(prefs.get(ID2, "Hello World"));
// Define a integer with default 50
System.out.println(prefs.getInt(ID3, 50));
// now set the values
prefs.putBoolean(ID1, false);
prefs.put(ID2, "Hello Europa");
prefs.putInt(ID3, 45);
// Delete the preference settings for the first value
prefs.remove(ID1);
}
public static void main(String[] args) {
PreferenceTest test = new PreferenceTest();
test.setPreference();
}
}
以下是后续运行的输出:
1)初始运行以保存首选项:
true 2019 年 4 月 23 日晚上 10:56:22 java.util.prefs.WindowsPreferences Hello World 警告:无法在根 0x80000002 打开/创建首选项根节点 Software\JavaSoft\Prefs。Windows RegCreateKeyEx(...) 返回错误代码 5. 50
2)第二次运行已经读取了第一次运行时写入的值:
true 2019 年 4 月 23 日晚上 10:56:57 java.util.prefs.WindowsPreferences Hello Europa 警告:无法在根 0x80000002 打开/创建首选项根节点 Software\JavaSoft\Prefs。Windows RegCreateKeyEx(...) 返回错误代码 5. 45
您可能会注意到 int 和 String 值被很好地检索并且没有被默认值替换,而布尔值没有被检索并且被替换为默认值(即两个输出都在那里给出 true 而期望是实现 false在第二次运行)。
解决方案
我在这里错了:我错过了从首选项中删除 ID1 密钥的事实:
// Delete the preference settings for the first value
prefs.remove(ID1);
如果我将其注释掉,一切都会按预期进行。
推荐阅读
- sql - SQL - 按产品类别和按客户 ID 分组的销售额
- python - 无法将 runserver_plus 用于 django
- javascript - 如何修复灵活的动态步进器以根据活动索引进行更改
- javascript - 与 iframe 的边缘兼容性导致重新加载而不是想要的行为
- authentication - 使用 Okta 的故事书 - 允许的登录 URI
- html - 为什么我不能将我的图像修复到我的引导网站的左侧?
- ruby-on-rails - Rails 6.1.4 中的 ActiveRecord 枚举行为更改
- .net - 如何删除 NavigationViewItem 周围的意外白色边框?
- python - SQLAlchemy SQL 注入保护在核心级别或仅在 ORM 级别
- python - print(os.listdir()) 使用时打印不存在的(旧)文件