• 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

  • 相关阅读:
    (Problem 14)Longest Collatz sequence
    (Problem 13)Large sum
    (Problem 10)Summation of primes
    (Problem 9)Special Pythagorean triplet
    (Problem 7)10001st prime
    (Problem 6)Sum square difference
    数组
    断点及复习
    抽象和封装
    类和对象
  • 原文地址:https://www.cnblogs.com/gongchenglion/p/properties.html
Copyright © 2020-2023  润新知