在 Java 中,我需要找到一种方法在本地存储一些数据,以便在重新启动之间可用。简单的东西,比如窗口
位置/大小。
我认为Preferences API 适合这个要求。简而言之:
应用程序需要偏好和配置数据以适应
不同用户和环境的需求。 java.util.prefs 包
为应用程序提供一种存储和检索用户和系统的方法
偏好和配置数据。数据永久存储在
依赖于实现的后备存储。有两个分开的
偏好节点树,一棵用于用户偏好,一棵用于系统
偏好。
有一个简短而有用的教程here。以下是根据您的要求的一个小示例:
import java.util.prefs.Preferences;
import javax.swing.JFrame;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
public class SwingPreferencesTest {
private void createAndShowGUI() {
JTextField dummyTextField = new JTextField(20);
JFrame frame = new JFrame("Demo");
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frame.add(dummyTextField);
frame.pack();
frame.setLocationByPlatform(true);
frame.setVisible(true);
Preferences prefs = Preferences.userRoot().node(this.getClass().getName());
// Define default values here
System.out.println("width: " + prefs.getDouble("width", 100d));
System.out.println("height: " + prefs.getDouble("height", 100d));
System.out.println("x: " + prefs.getDouble("x", 0d));
System.out.println("y: " + prefs.getDouble("y", 0d));
// Set new values here
prefs.putDouble("width", frame.getPreferredSize().getWidth());
prefs.putDouble("height", frame.getPreferredSize().getHeight());
prefs.putDouble("x", frame.getLocationOnScreen().getX());
prefs.putDouble("y", frame.getLocationOnScreen().getY());
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
new SwingPreferencesTest().createAndShowGUI();
}
});
}
}
如果您第一次运行它,您会在控制台中看到首选项默认值:
width: 100.0
height: 100.0
x: 0.0
y: 0.0
如果您再次运行它,那么这些值将被更新。就我而言:
width: 240.0
height: 59.0
x: 130.0
y: 130.0
编辑
根据下面的@Puce 评论,Windows 上的数据存储在注册表中,这是有道理的,因为这是 Windows 用来存储用户/系统/软件数据的方式。您可以在HKEY_CURRENT_USER\JavaSoft\Prefs\[package\class name]下找到示例中生成的注册表项,如下图所示:
注意:在 Windows 8 x64、JDK 1.7 上测试
如果您不想使用这些首选项填充注册表,那么您可以只存储应用程序文件夹的路径(与其他应用程序一样)并使用此路径从普通属性文件加载配置数据。继续使用 Preferences(至少存储应用程序的路径)的主要优点是检索/存储配置数据的机制被设计为跨平台,JVM 实现者(而不是开发人员)必须处理实际实现。