Java 如何清除 kidCache?
Java How do you clear kidCache?
Java classPreferences
有一个名为 kidCache
的 HashMap 属性。当执行 Preferences
方法 remove(String node)
节点有效地从用户的首选项文件中删除,但不是从 kidCache
属性.
因此,当我打印到控制台 prefs.nodeExists("account-1")
或 Arrays.toString(prefs.childrenNames())
时,它仍然显示为可用。直到当前程序执行完毕才最终清零。
public class ClassA {
private Preferences prefs = Preferences.userRoot().node("TestNode");
public static void main(String[] args) {
new ClassA();
}
public ClassA() {
prefs = Preferences.userRoot().node("TestNode/account-1");
prefs.put("username", "testUser1");
prefs = Preferences.userRoot().node("TestNode");
prefs.remove("account-1/"); // node removed here
try {
System.out.println(prefs.nodeExists("account-1")); // a test for its existance still outputs 'true'
System.out.println(Arrays.toString(prefs.childrenNames())); // kidCache can be retrieved with this method
} catch (BackingStoreException e) {
e.printStackTrace();
}
}
}
输出:
Connected to the target VM, address: '127.0.0.1:58572', transport: 'socket'
true
[account-1]
我尝试使用 prefs.flush()
,但没有用。如何在程序执行完之前彻底清除子节点?
我找到了解决问题的方法。虽然我还没有弄清楚如何手动清除 kidCache,但删除节点的正确方法是设置节点的路径,然后使用 removeNode()
方法而不是 remove(String node)
方法一级向上。
public class ClassA {
private Preferences prefs = Preferences.userRoot().node("TestNode");
public static void main(String[] args) {
new ClassA();
}
public ClassA() {
prefs = Preferences.userRoot().node("TestNode/account-1");
prefs.put("username", "testUser1");
prefs.removeNode();
prefs = Preferences.userRoot().node("TestNode");
try {
System.out.println(prefs.nodeExists("account-1")); // a test for its existence now outputs 'false'
} catch (BackingStoreException e) {
e.printStackTrace();
}
}
}
输出
Connected to the target VM, address: '127.0.0.1:58572', transport: 'socket'
false
Java classPreferences
有一个名为 kidCache
的 HashMap 属性。当执行 Preferences
方法 remove(String node)
节点有效地从用户的首选项文件中删除,但不是从 kidCache
属性.
因此,当我打印到控制台 prefs.nodeExists("account-1")
或 Arrays.toString(prefs.childrenNames())
时,它仍然显示为可用。直到当前程序执行完毕才最终清零。
public class ClassA {
private Preferences prefs = Preferences.userRoot().node("TestNode");
public static void main(String[] args) {
new ClassA();
}
public ClassA() {
prefs = Preferences.userRoot().node("TestNode/account-1");
prefs.put("username", "testUser1");
prefs = Preferences.userRoot().node("TestNode");
prefs.remove("account-1/"); // node removed here
try {
System.out.println(prefs.nodeExists("account-1")); // a test for its existance still outputs 'true'
System.out.println(Arrays.toString(prefs.childrenNames())); // kidCache can be retrieved with this method
} catch (BackingStoreException e) {
e.printStackTrace();
}
}
}
输出:
Connected to the target VM, address: '127.0.0.1:58572', transport: 'socket'
true
[account-1]
我尝试使用 prefs.flush()
,但没有用。如何在程序执行完之前彻底清除子节点?
我找到了解决问题的方法。虽然我还没有弄清楚如何手动清除 kidCache,但删除节点的正确方法是设置节点的路径,然后使用 removeNode()
方法而不是 remove(String node)
方法一级向上。
public class ClassA {
private Preferences prefs = Preferences.userRoot().node("TestNode");
public static void main(String[] args) {
new ClassA();
}
public ClassA() {
prefs = Preferences.userRoot().node("TestNode/account-1");
prefs.put("username", "testUser1");
prefs.removeNode();
prefs = Preferences.userRoot().node("TestNode");
try {
System.out.println(prefs.nodeExists("account-1")); // a test for its existence now outputs 'false'
} catch (BackingStoreException e) {
e.printStackTrace();
}
}
}
输出
Connected to the target VM, address: '127.0.0.1:58572', transport: 'socket'
false