zoukankan      html  css  js  c++  java
  • Java 读写Properties配置文件

    这两天做java项目,用到属性文件,到网上查资料,好半天也没有找到一个满意的方法能让我读取到.properties文件中属性值,很是郁闷,网上讲的获取属性值大概有以下方法,以下三种方法逐渐优化,以达到最好的效果
    以下都以date.properties文件为例,该文件放在src目录下,文件内容为
    startdate=2011-02-07
    totalweek=25
    方法一:
    public class Stweek {
     static private String startdate = null;
     static private String totalweek = null;
     synchronized static public void loads(){
      if(startdate == null || totalweek == null)
      {
       FileInputStream is = null;
       Properties dbProps = new Properties();
         try {
            is = new FileInputStream(filepath);  
            dbProps.load(is);
            startdate = dbProps.getProperty("startdate");
            totalweek = dbProps.getProperty("totalweek");
          }
          catch (Exception e) {
            System.err.println("不能读取属性文件. " +
           "请确保db.properties在CLASSPATH指定的路径中");
          }
      }
     }
     public static String getStartdate() {
      if(tartdate==null)
       loads();
      return startdate;
     }
     
     public static String getTotalweek() {
      if(startdate==null)
       loads();
      return totalweek;
     } 
    }
    以上方法虽然也能获得配置文件内容,可是其最大的问题就是文件路径的定位(就是代码中的filepath取值问题),当采用绝对定位的时候,如果将工程移到另外一个盘符下运行,就需要修改源代码,否则就会报错,可是如果使用相对路径,当Stweek 类移到另外一个包中时,还是要修改源代码,否则会报错,所以说这个方法局限太大,不好 ,以下方法二能解决这个问题,可是其还是有些问题
    方法二:
    public class Stweek {
     InputStream is = null;
     Properties dbProps = null;
     public Stweek() {
      // TODO Auto-generated constructor stub
      is = getClass().getResourceAsStream("/date.properties");
      dbProps = new Properties();
        try {
          dbProps.load(is);
        }
        catch (Exception e) {
          System.err.println("不能读取属性文件. " +
         "请确保db.properties在CLASSPATH指定的路径中");
        }
     }
     public String getStartdate()
     {
      String sd = null;
      sd = dbProps.getProperty("startdate");
      return sd;
     }
     
     public String getTotalweek()
     {
      String totalweek=null;
         totalweek = dbProps.getProperty("totalweek");
      return totalweek;
     }
    }
    这个方法的好处就是不用指出配置文件的绝对路径,而且不管是将Stweek 类放到另外的包中,还是将整个工程移到到另外的盘符下,代码依然可以正常运行,不会有找不到文件的问题,可是这个方法仍然有一个重大的缺陷,因为我们往往希望配置文件能够缓存在内存中,这样不用每次读取时都要访问硬盘(访问外存太浪费时间),为此我们希望使用静态变量、静态方法来缓存和获得变量,同时能够实现这些值的动态加载(load),那么问题来了,因为getClass().getResourceAsStream("/date.properties"); 这一句只能出现在构造函数中(同鞋可以自己测试一下),动态load中并不能使用这个方法,怎么办呢,且看第三个方法
     
    方法三:
    import java.io.InputStream;
    import java.util.Properties;
    public class Stweek {
     static private String startdate = null;
     static private String totalweek = null;
     static{
      loads();
     }
     synchronized static public void loads(){
      if(startdate == null || totalweek == null)
      {
       InputStream is = Stweek.class.getResourceAsStream("/date.properties");
       Properties dbProps = new Properties();
         try {
            dbProps.load(is);
            startdate = dbProps.getProperty("startdate");
            totalweek = dbProps.getProperty("totalweek");
          }
          catch (Exception e) {
            System.err.println("不能读取属性文件. " +
           "请确保db.properties在CLASSPATH指定的路径中");
          }
      }
     }
     public static String getStartdate() {
      if(startdate==null)
       loads();
      return startdate;
     }
     public static String getTotalweek() {
      if(startdate==null)
       loads();
      return totalweek;
     } 
    }
    这个方法不仅能够缓存配置文件内容,还能够做到自动加载配置文件的内容到内存,使用者完全不用考虑手动加载的过程,只需要在需要用到的地方直接调用Stweek.getStartdate()即可(因为是静态方法,事先连对像也不用创建的),这样如果内存中有缓存,函数就会直接读取内存中的数据,节省时间,如果没有缓存也不用担心,系统会自动为你加载,使用者完全不用知道其是如何实现的,只需要知道我能直接调用函数获得想要的值就行了,呵呵,简单吧
  • 相关阅读:
    Java 第十一届 蓝桥杯 省模拟赛 洁净数
    Java 第十一届 蓝桥杯 省模拟赛 第十层的二叉树
    Java 第十一届 蓝桥杯 省模拟赛 第十层的二叉树
    Java 第十一届 蓝桥杯 省模拟赛 第十层的二叉树
    Java 第十一届 蓝桥杯 省模拟赛 70044与113148的最大公约数
    Java 第十一届 蓝桥杯 省模拟赛 70044与113148的最大公约数
    20. Valid Parentheses
    290. Word Pattern
    205. Isomorphic Strings
    71. Simplify Path
  • 原文地址:https://www.cnblogs.com/jym-sunshine/p/4917110.html
Copyright © 2011-2022 走看看