典型的应用程序安装程序需要向用户询问几个选项,其中一些是配置问题,例如,应用程序应在其上运行的端口,应如何运行等。应用程序必须记住这些选项,并在每个选项中使用它们。跑。 解决此问题的标准方法是将这些选项写入属性文件,该文件可以在应用程序启动时加载。 但是随后问题又转移到其他地方,即记住安装路径,然后从安装路径加载所需的属性文件。

记住安装路径可以通过设置环境变量(例如,MYAPP_HOME)来解决。 变量可以在安装时用所需的值初始化,以便每次加载应用程序时都将设置该变量。 这是大多数项目中采用的典型解决方案。

其他解决方案

JDK提供的Preferences API可用于解决此典型问题。 首选项就像属性一样工作,但与属性不同,它们是持久的。 在背面,当写入首选项时,它将被存储到后备存储中。 当您要求首选项时,将从该存储中加载该值。 在典型的Windows计算机上,默认存储为Windows注册表,但该存储是可配置的,您可以将其更改为所需的文件,例如文件。

写首选项很简单。 与基于字符串的键/值对的属性不同,首选项具有字符串的键,但是您可以存储所有基本类型的值,例如long , boolean , double等。

public class StaticPreferenceFactory {public static void main(String args[]) throws Exception {Preferences prefsRoot = Preferences.userRoot();Preferences myPrefs = prefsRoot.node("com.myapp.preference.staticPreferenceLoader");myPrefs.put("fruit", "apple");myPrefs.putDouble("price", 40);myPrefs.putBoolean("available", false);return prefsRoot;}
}

就像我们有系统变量和用户变量一样。 您可以通过调用systemRoot()获得一个系统首选项节点,并且您可以通过调用userRoot()节点获得一个用户首选项节点。 一旦首选项存储在userNode中,系统的其他用户就无法访问它,就像用户变量一样。 您可以清除通过调用clear() API编写的首选项。

public class UsePreference {public static void main(String args[]) throws Exception {Preferences myfilePrefs = Preferences.userRoot();myfilePrefs = myfilePrefs.node("com.myapp.preference.staticPreferenceLoader");System.out.println("finding fruit:"+ myfilePrefs.get("fruit", "not found") + " available :"+ myfilePrefs.getBoolean("available", true));}
}

就像属性一样,检索首选项也很简单。 如果找不到该值,此处的get API会使用两个参数:要找到的键和默认值。

Spring还提供了PreferencesPlaceholderConfigurer ,可用于加载首选项。

<bean id="preferencePlaceHolder"class="org.springframework.beans.factory.config.PreferencesPlaceholderConfigurer"><property name="userTreePath" value="com.myapp.preference.staticPreferenceLoader" />
</bean>
<bean id="myEntity" class="info.dependencyInjection.spring.factory.MyEntity"><property name="value" value="${fruit}" />
</bean>

对于我们的安装程序问题,我们可以在安装时将所有配置选项存储在“首选项”中,应用程序将只关心读取这些值。 这样,我们可以避免编写环境变量的所有麻烦,并确保每次都加载正确的变量。

参考:在我们的JCG合作伙伴 Rahul Sharma的“到目前为止之路”博客 中 , 使用java.util.prefs.Preferences代替java.util.Properties 。

相关文章 :
  • 做短,但做对!
  • 在Java 7中处理文件
  • Java泛型快速教程
  • Google Guava库必需品
  • Java最佳实践–多线程环境中的DateFormat

翻译自: https://www.javacodegeeks.com/2011/09/use-javautilprefspreferences-instead-of.html

使用java.util.prefs.Preferences代替java.util.Properties相关推荐

  1. java.util.prefs.Preferences

    我们经常需要将我们的程序中的设定,如窗口位置,开启过的文件,用户的选项设定等数据记录下来,以做便用户下一次开启程序能继续使用这些数据. 以前我们通常的做法是使用Properties类,它提供以下方法: ...

  2. java.util.prefs.Preferences用法

    我们经常需要将我们的程序中的设定,如窗口位置,开启过的文件,用户的选项设定等数据记录下来,以做便用户下一次开启程序能继续使用这些数据. 以前我们通常的做法是使用Properties类,它提供以下方法: ...

  3. win7 java注册表_使用JAVA和JNA在64位Win 7上读/写Windows注册表

    我正在尝试使用JAVA在64位Win7上读/写 Windows注册表. 首先,我尝试了JDK java.util.prefs.Preferences and its reflection usage. ...

  4. Couldn‘t flush user prefs: java.util.prefs.BackingStoreException: Couldn‘t get file lock

    最近在部署秒杀项目的时候,部署完以后,发现项目报错,如下: 文章目录 问题详情 解决方法 ulimit常用命令 问题详情 Waiting for possible Shutdown/StopTestN ...

  5. java.util.prefs.WindowsPreferences <init>异常警告

    java.util.prefs.WindowsPreferences WARNING: Could not open/create prefs root node Software\JavaSoft\ ...

  6. Scala error: type mismatch; found : java.util.List[?0] required: java.util.List[B]

    Scala error: type mismatch; found : java.util.List[?0] required: java.util.List[B] 目录 Scala error: t ...

  7. mybatis中传集合时 报异常 invalid comparison: java.util.Arrays$ArrayList and java.lang.String

    mybatis中传集合时 报异常 invalid comparison: java.util.Arrays$ArrayList and java.lang.String 参考文章: (1)mybati ...

  8. Java并发编程-并发工具包(java.util.concurrent)使用指南(全)

    1. java.util.concurrent - Java 并发工具包 Java 5 添加了一个新的包到 Java 平台,java.util.concurrent 包.这个包包含有一系列能够让 Ja ...

  9. java.lang.NoClassDefFoundError: org/apache/tomcat/util/res/StringManager

    java.lang.NoClassDefFoundError: org/apache/tomcat/util/res/StringManager 一个比较老的web项目,  IDEA 导入后不能用,  ...

最新文章

  1. 转:delphi用URLDownloadToFile下载文件,用进度条跟踪下载进度
  2. c语言消字母游戏实验报告,C语言编程实验报告格式示例
  3. 安规电容能用什么代替_电容系列之安规电容
  4. javaslang_使用Javaslang的Java 8中的功能数据结构
  5. 欧拉定理(洛谷-P5091)(十进制快速幂实现)
  6. 模式识别中的特征提取及其内在意义
  7. 封装自己的LINUX光盘
  8. FastStone Capture无法录制系统声音解决方法(win10)
  9. 李飞飞、吴恩达、Bengio等人的15大顶级深度学习课程(转)
  10. win7+Ubuntu20.04双系统硬盘安装指南(含踩坑记录)
  11. 一位16年老员工的反思:什么才是真正的执行力?
  12. workerman创建wss服务
  13. go+gSoap+onvif学习总结:7、进行镜头调焦、聚焦和预置点的增删改查
  14. Java之throw和throws的区别
  15. iPhone最强悍对抗者——HTC崛起的秘密
  16. mqtt协议之Apache Apollo 安装和配置
  17. kotlin基础教程:<6>map集合
  18. NOI 2005 题解
  19. 第1年的放射学侵蚀进展是早期RA进一步侵蚀性进展的新预测指标
  20. xmind怎么导出甘特图_张兵导图:xmind如何绘制甘特图?

热门文章

  1. apigee 安装_APIGEE:用于API代理的CI / CD管道
  2. tomee_OpenLiberty:注入错误,适用于TomEE和Wildfly
  3. 朝着理想坚实迈进_坚实原则:接口隔离原则
  4. 混合多云架构_混合多云每个人都应避免的3个陷阱(第1部分)
  5. javaone_JavaOne和OOW 2015总结
  6. Java ArrayDeque
  7. java 8 集合分组_Java 8:按集合分组
  8. Java 8中的功能接口是什么? @功能注释和示例
  9. jax-ws cxf_走向REST:将Tomcat嵌入Spring和JAX-RS(Apache CXF)
  10. 如何在Java中实现线程池