gpt4 book ai didi

java - 访问特定于平台的应用程序数据区域

转载 作者:搜寻专家 更新时间:2023-10-31 20:28:04 25 4
gpt4 key购买 nike

在 Java 中,我需要找到一种方法在本地存储一些数据,以便在重新启动之间可用。简单的事情,例如窗口位置/大小。我知道此类信息通常存储在 Windows 上的 C:\Users\<username>\AppData(通过在 Windows 资源管理器的地址栏中键入 %APPDATA% 访问),但我不知道它存储在 Mac OS X 上的什么位置。(作为旁注,我仍然不知道不了解 Windows 上 %APPDATA% 文件夹及其 \Roaming\Local\LocalLow 等子文件夹的结构。)

当然,根据操作系统的不同,可以通过某种方式将窗口位置等信息存储在这些区域中。或许甚至已经有一个库可以完成这些相对普遍的任务?

最佳答案

In Java, I need to find a way to store some data locally so that it is available between reboots. Simple things, such as window location/size.

我认为Preferences API适合这个要求。简而言之:

Applications require preference and configuration data to adapt to the needs of different users and environments. The java.util.prefs package provides a way for applications to store and retrieve user and system preference and configuration data. The data is stored persistently in an implementation-dependent backing store. There are two separate trees of preference nodes, one for user preferences and one for system preferences.

有一个简短但有用的教程 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]下找到示例中生成的注册表项,如下图所示:

enter image description here

注意:在 Windows 8 x64、JDK 1.7 上测试

如果您不想用这些首选项填充注册表,那么您可以只存储应用程序文件夹的路径(就像其他应用程序一样)并使用此路径从普通属性文件加载配置数据。继续使用首选项(至少存储应用程序的路径)的主要优点是检索/存储配置数据的机制被设计为跨平台的,JVM 实现者(而非开发人员)必须处理实际实现。

关于java - 访问特定于平台的应用程序数据区域,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26142656/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com