我正在使用 java.util.prefs.Preferences 作为应用程序首选项。而且我需要手动编辑这些首选项的能力。是否可以将其存储到文件而不是 Windows 注册表中?或者我应该使用另一种机制而不是 java.util.prefs.Preferences?
7 回答
如果您想继续使用 Preferences API,但要写入文件,您将需要一个新的PreferencesFactory,如此 SO post中所述。
您将要使用以下两种方法:
Preferences.exportSubtree(OutputStream os)
和
Preferences.importPreferences(InputStream is)
此代码应该可以帮助您 [http://java.sun.com/developer/technicalArticles/releases/preferences/]:
public class PrefSave {
private static final String PACKAGE = "/pl/test";
public static void main(String[] args) {
doThings(Preferences.systemRoot().node(PACKAGE));
doThings(Preferences.userRoot().node(PACKAGE));
}
public static void doThings(Preferences prefs) {
prefs.putBoolean("Key0", false);
prefs.put("Key1", "Value1");
prefs.putInt("Key2", 2);
Preferences grandparentPrefs = prefs.parent().parent();
grandparentPrefs.putDouble("ParentKey0", Math.E);
grandparentPrefs.putFloat("ParentKey1", (float) Math.PI);
grandparentPrefs.putLong("ParentKey2", Long.MAX_VALUE);
String fileNamePrefix = "System";
if (prefs.isUserNode()) {
fileNamePrefix = "User";
}
try {
OutputStream osTree = new BufferedOutputStream(
new FileOutputStream(fileNamePrefix + "Tree.xml"));
grandparentPrefs.exportSubtree(osTree);
osTree.close();
OutputStream osNode = new BufferedOutputStream(
new FileOutputStream(fileNamePrefix + "Node.xml"));
grandparentPrefs.exportNode(osNode);
osNode.close();
} catch (IOException ioEx) {
// ignore
} catch (BackingStoreException bsEx) {
// ignore too
}
}
尝试以下类,它允许您使用本地文件使用一些简单put()
的功能。get()
configuration.xml
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.InvalidPropertiesFormatException;
import java.util.Properties;
public class SimpleProperties
{
private String propertiesFilePath;
private Properties properties;
public SimpleProperties() throws InvalidPropertiesFormatException, IOException
{
propertiesFilePath = "configuration.xml";
properties = new Properties();
try
{
properties.loadFromXML(new FileInputStream(propertiesFilePath));
} catch (InvalidPropertiesFormatException e)
{
}
}
public void put(String key, String value) throws FileNotFoundException, IOException
{
properties.setProperty(key, value);
store();
}
public String get(String key)
{
return properties.getProperty(key);
}
private void store() throws FileNotFoundException, IOException
{
String commentText = "Program parameters";
properties.storeToXML(new FileOutputStream(propertiesFilePath), commentText);
}
}
在另一篇文章中对此进行了解释,here
Properties prop = new Properties();
InputStream in = getClass().getResourceAsStream("foo.properties");
prop.load(in);
in.close()
我认为您可以改用属性文件。它们存储在文件系统中。你可以定义你想要的路径。您可以手动编辑它。有关更多详细信息,请参阅此问题。
不久前,我不得不想出一个 Preferences 类的实现,它可以从注册表读取设置但不写入注册表。我从 AbstractPreferences 派生了一个 ReadOnlyPreferences 类来完成此任务。后来,我需要与访问/从文件完全相同的功能。我刚刚扩展了我的 ReadOnlyPreferences 类以覆盖 sync() 和 flush() 以保持文件同步。关于这一点很酷的部分,它将使用完全相同的逻辑将默认值应用于值,就像通常使用首选项一样,因为注册表中实际上没有任何内容可供读取。我使用基类中的 exportSubtree() 和 importPreferences() 使文件保持同步,为我完成所有繁重的工作。
很抱歉,我无法发布代码,因为我不拥有它,但我使用了您可以在以下链接中找到的加密首选项作为起点。这就是我所做的,我花了大约一个小时将它提炼成我需要的东西,主要是扔掉代码,这比编写代码容易得多!如果您不想单击第一个,它也发布在 Dobbs 博士的以下链接中。我只是从来没有在 dobbs 文章上看到一个简单的地方来下载整个源代码。无论如何,这篇文章是我见过的最好的扩展偏好的文章。
http://www.panix.com/~mito/articles/#ep
http://www.drdobbs.com/security/encrypted-preferences-in-java/184416587?pgno=4