你的位置:首页 > Java教程

[Java教程]Java关于Properties用法的总结(一)


 

最近项目中有一个这样的需求,要做一个定时任务功能,定时备份数据库的操表,将表数据写入txt文件。因为文件的读写路径可能需要随时改动,所以写死或者写成静态变量都不方便,就考虑使用配置文件,这里总结些配置文件用法。


一、Java Properties类

1、Java中有个比较重要的的类Properties(java.util.Properties),是代表一个持久的一套详细属性,属性可以被保存到一个流或从流中加载的类。以下是关于属性的要点:

  • 属性列表中每个键及其对应值是一个字符串。

  • 一个属性列表可包含另一个属性列表作为它的“默认”,第二个属性可在列表中搜索,如果没有在原有的属性列表中找到的属性键。

  • 这个类是线程安全的;多个线程可以共享一个Properties对象,而不需要外部同步

  • 2、该类的主要方法如下:

    火狐截图_2016-01-29T08-33-58.854Z

    3、主要用于读取Java配置文件,存放一些经常用到的数据,方便程序员修改。该配置文件是个文本文件,后缀名为(.properties),

    文件的内容格式为“key=value”,文本注释可以使用”#“来注释。如下图:

    image

     

    4、在配置文件中直接写中文读取的时候会有乱码,所以要转码成ASCII。eclipse最新版本中会自动转码,如果需要手动转码,可以借助一些在线转码工具,这里推荐一个:

    http://tool.oschina.net/encode?type=3


    二、Java Properties实例

    1、从目标路径test.properites中获取输入流对象

    2、使用Properties类的load()方法从字节输入流中获取数据

    3、直接打印Properties对象

    4、使用Properties类的getProperty(String key)方法,根据参数key获取value

    5、具体代码如下:

    package example;import java.io.IOException;import java.io.InputStream;import java.net.URL;import java.net.URLDecoder;import java.net.URLEncoder;import java.util.Properties;public class Test {  public static void main(String[] args) {    try {      Properties prop = new Properties();          InputStream in = Test.class.getClassLoader().getResourceAsStream(          "test.properties");      prop.load(in);      //直接输出prop对象      System.out.println("直接输出prop对象:"+prop);      //获取name的值      String name=prop.getProperty("name");      //获取address的值      String address=prop.getProperty("address");      //获取job的值      String job=prop.getProperty("job");      System.out.println("name="+name+",address="+address+",job="+job);    } catch (IOException e) {      // TODO Auto-generated catch block      e.printStackTrace();    }  }}

    6、执行结果如下:

    image

    从上图可以看出,job的值是乱码,说明在配置文件中不可以直接使用中文。还有#号后面的注释没有打印出来。


三、关于路径问题的补充

1、上述获得Properties配置文件中英文是通过Test.class.getClassLoader().getResourceAsStream()方法直接获得字节输入流,所以不用考虑路径中是否包含中文的问题,如果是通过Test.class.getClassLoader().getResource()方法,因为该方法返回值是URL,如果项目的目录中有中文命名,则获得的URL会出现乱码,所以使用        

String path=URLDecoder.decode(url.getFile(), "utf-8");

2、具体代码如下:

package example;import java.io.FileInputStream;import java.io.IOException;import java.io.InputStream;import java.net.URL;import java.net.URLDecoder;import java.net.URLEncoder;import java.util.Properties;public class Test {  public static void main(String[] args) {    try {      Properties prop = new Properties();      Properties prop2 = new Properties();//       String path =Test.class.getClassLoader().getResource("example/china/test2.properties").getPath();      //获得URL路径      URL url=Test.class.getClassLoader().getResource("example/china/test2.properties");      //打印路径      System.out.println("url.getFile()="+url.getFile());      //将路径中的中文转码      String path=URLDecoder.decode(url.getFile(), "utf-8");      System.out.println("path="+path);      //通过路径获得字节输入流      InputStream input=new FileInputStream(path);      //直接获得字节输入流      InputStream in = Test.class.getClassLoader().getResourceAsStream("example/china/test2.properties");            prop.load(in);      prop2.load(input);      System.out.println("prop="+prop);      System.out.println("prop2="+prop2);    } catch (IOException e) {      // TODO Auto-generated catch block      e.printStackTrace();    }  }}

3、输出结果:

image




英国旅游多少钱一人英国游费用英国旅游团购英国蜜月旅游暑假去英国旅游价格秋色浸染金陵城 南京五大赏秋圣地 享受云中漫步 河南最佳云海观赏地推荐 广西秋季登高好去处,你都知道哪些? 4种暖色调 让重庆的秋天明亮起来 梦幻水城日场票团购优惠多少?珠海梦幻水城日场和夜场有什么区别? 梦幻水城门票珠海团购多少钱一张?珠海梦幻水城团体票打折吗? 2015珠海梦幻水城团购票价?珠海市梦幻水城人多优惠吗? 珠海梦幻水城日场团购价格?梦幻水城日场玩到几点? 从梅家大院到江门上川岛自驾游如何走呀? 广州天河公园在那里?天河公园需要门票吗? 广东有哪些岛好玩呢? 肇庆有哪些比较有特色点的特产呢? 2015广州长隆大马戏圣诞节夜场活动时间?长隆大马戏圣诞夜场几时开始? 2015广州长隆大马戏圣诞节夜场活动门票预订价格?长隆大马戏圣诞夜场门票多少钱? 2015深圳锦绣中华圣诞节夜场活动门票预订价格?锦绣中华圣诞夜场门票多少钱? 2015深圳世界之窗圣诞节夜场活动门票预订价格?世界之窗圣诞夜场门票多少钱? LM4030AMFX4.096/NOPB Datasheet LM4030AMFX4.096/NOPB Datasheet LM3671TLX-2.8/NOPB Datasheet LM3671TLX-2.8/NOPB Datasheet LP38693MPX-5.0/NOPB Datasheet LP38693MPX-5.0/NOPB Datasheet 贵州省旅游攻略 贵州省旅游攻略 贵州省旅游攻略 深圳到巴厘岛旅游 深圳到巴厘岛旅游 深圳到巴厘岛旅游 台湾特产 台湾特产 台湾特产