在Java中存储应用程序的conf数据的正确方法是什么?

在哪里为J2SE应用程序存储特定于用户机器的 运行时配置数据?

(例如,Windows上的C:\ Users \ USERNAME \ AppData \ Roaming \和Unix上的/ home / username

如何以与平台无关的方式在文件系统中获取这些位置?

谢谢你的建议!

这取决于您的J2SE应用程序类型:

  • J2SE可执行JAR文件(很简单):使用user.home系统属性查找home-dir。 然后相应地制作一个子目录(例如PGP,SVN,……)
  • Java Web Start为安全属性提供了非常好的包含方法。 始终是用户特定的
  • 最后Eclipse RCP:你有工作区的概念(也来自user.home)用于用户和配置(不完全确定如何在Vista中访问那些棘手的东西)以供计算机广泛使用

所有这些方法,在小心使用时 – 使用正确的separatorChar – OS中性。

首先是格式:

  1. Java 属性文件适用于键/值对(也自动处理换行符)。 使用“点符号”可以实现一定程度的结构。 缺点是该结构不允许您轻松枚举顶级配置实体并以深入的方式工作。 最适用于一小组经常可调整的环境特定设置
  2. XML文件 – 经常用于各种Java框架(尤其是J2EE和Spring)的更复杂配置。 我建议您至少要了解Spring – 它包含许多值得了解的想法,即使您决定不使用它。 如果您决定推出自己的XML配置,我建议使用XStream和自定义序列化选项,或者如果您只需要解析一些XML,请查看XOM 。 BTW Spring还允许您插入自定义XML配置语言,但这是一项相对复杂的任务 。 XML配置最适用于最终用户未看到或调整的更复杂的“内部”配置。
  3. 序列化Java对象 – 一种快速简便的方法,可以持久保存对象的状态并在以后恢复。 如果您编写配置GUI并且不关心配置是否可读,则非常有用。 在进化类时要注意兼容性问题 。
  4. 首选项 – 在Java 1.4中引入,允许您在特定于平台的存储中存储键入的文本,数字,字节数组和其他基元。 在Windows上,这是注册表(您可以在HKLMHKCU下选择/ Software / JavaSoft / Prefs )。 在Unix下,相同的API在用户主目录或/ etc下创建文件。 每个prefs配置单元都可以作为XML文件导出和导入。 您可以通过将“java.util.prefs.PreferencesFactory”JVM属性设置为实现类名来指定PreferencesFactory接口的自定义实现。

通常,根据您的应用场景,使用prefs API可能是好事还是坏事。

  1. 如果您计划在具有不同配置的同一台计算机上运行相同代码的多个版本,那么使用Preferences API是个坏主意。
  2. 如果您计划在受限制的环境(Windows域或严格管理的Unix机箱)中使用该应用程序,则需要确保您具有对必要的注册表项/目录的正确访问权限。 这不止一次让我感到意外。
  3. 请注意漫游配置文件(复制的家庭目录),当涉及多个活动计算机时,它们会弥补一些有趣的情况。
  4. 首选项不如应用程序目录下的配置文件那么明显。 大多数桌面支持人员并不期望也不喜欢他们。

关于prefs的文件布局,它还取决于您的应用程序。 一般建议是:

  1. 将大多数XML文件打包在应用程序的JAR中,位于根目录或/ META-INF目录下。 这些文件将是只读的,并被视为应用程序的私有文件。
  2. 将用户可修改的配置放在$ APP_HOME / conf下 。 它应该主要由属性文件组成,偶尔也应该包含一个简单的XML文件(XStream序列化)。 这些文件作为安装过程的一部分进行了调整,通常不是用户可维护的。
  3. 在user-home下,在dot-directory(即’〜/ .myapplication’)中存储任何用户配置。 用户配置可能会覆盖应用程序conf目录中的配置 。 从应用程序中进行的任何更改都会在此处进行(另请参阅下一点)。
  4. 您还可以使用$ APP_HOME / var目录来存储特定于此应用程序实例的任何其他可变数据(而不是用户)。 这种方法的另一个优点是,您可以通过简单复制一个目录来移动和备份整个应用程序及其配置。

这说明了一些管理配置的标准技术。 您可以使用不同的库和工具来实现它们,从原始JRE开始,添加Spring / Guice或者获取完整的J2EE容器(可能使用嵌入式Spring)

其他管理配置的方法是:

  1. 使用多个基目录使用不同的配置运行应用程序的多个实例。
  2. 使用轻量级 注册表进行集中配置管理
  3. 集中管理的配置管理数据库(CMDB)文件包含每台计算机的特定于主机的值,每晚都会对所有生产主机进行rsync。 应用程序使用模板化配置,并在运行时根据当前主机名从CMDB中进行选择。

Java有一个专门用于在java.util.prefs.Preferences中执行此操作的库。

Preferences userPrefs = Preferences.getUserNodeForPackage(MyClass.class); // Gets user preferences node for MyClass Preferences systemPrefs = Preferences.getSysteNodeForPackage(MyClass.class); // Gets system preferences node for MyClass Preferences userPrefsRoot = Preferences.getUserRoot(); // Gets user preferences root node Preferences systemPrefsRoot = Preferences.getSystemRoot(); // Gets system preferences root node 

您可能想要查看资源包 。

对于特定于用户的配置,您可以将配置文件写入“user.home”系统属性指向的文件夹。 当然只适用于那台机器。

我用这个


     String pathFile = null;
    如果(OS.contains( “赢”)){
         pathFile = System.getenv(“AppData”);
     }其他{
         pathFile = System.getProperty(“user.home”);
     }

我将应用程序的设置保存在其他平台上的windows user.home(/ home / USERNAME)上的C:\ Users \ USERNAME \ AppData \