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

时间:2014-10-01 13:32:29

标签: java swing storage

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

当然,根据操作系统,有一些方法可以将窗口位置等信息存储在这些区域中。也许甚至有一个图书馆已经预先建成用于完成这些相对无处不在的任务?

3 个答案:

答案 0 :(得分:2)

  

在Java中,我需要找到一种在本地存储一些数据的方法,以便在重新启动之间可用。简单的事情,比如窗户   的位置/尺寸。

我认为Preferences API符合这一要求。简而言之:

  

应用程序需要首选项和配置数据才能适应   不同用户和环境的需求。 java.util.prefs包。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(); } }); } }   为应用程序提供了一种存储和检索用户和系统的方法   首选项和配置数据。数据持久存储在   依赖于实现的后备存储。有两个单独的   偏好节点的树,一个用于用户偏好,一个用于系统   偏好。

有一个简短但有用的教程here。以下是基于您的要求的一个小例子:

width: 100.0
height: 100.0
x: 0.0
y: 0.0

如果您第一次在控制台中看到首选项默认值时运行它:

width: 240.0
height: 59.0
x: 130.0
y: 130.0

如果再次运行,则会更新这些值。就我而言:

HKEY_CURRENT_USER\JavaSoft\Prefs\[package\class name]

修改

根据下面的@Puce评论,Windows数据存储在注册表中,这是有道理的,因为它是Windows用来存储用户/系统/软件数据的方式。您可以在{{1}}下的示例中找到生成的注册表项,如下图所示:

enter image description here

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

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

答案 1 :(得分:0)

您可以将数据存储在

Paths.get(System.getProperty("user.home")).resolve(".my-application-conf")

或类似的东西。这应该适用于操作系统。

答案 2 :(得分:0)

AFAIK,标准Java库中没有解决方案。

您要么必须找到第三方库,要么使用其他解决方案(请参阅其他答案)。