zoukankan      html  css  js  c++  java
  • Java项目中读取properties文件

    下面1-4的内容是网上收集的相关知识,总结来说,就是如下几个知识点:

    1. 最常用读取properties文件的方法
    2. InputStream in = getClass().getResourceAsStream("资源Name");这种方式要求properties文件和当前类在同一文件夹下面。如果在不同的包中,必须使用:
    3. InputStream ins = this.getClass().getResourceAsStream("/cn/zhao/properties/testPropertiesPath2.properties");
    4. Java中获取路径方法
    5. 获取路径的一个简单实现
    6. 反射方式获取properties文件的三种方式

    1 反射方式获取properties文件最常用方法以及思考:

    Java读取properties文件的方法比较多,网上最多的文章是"Java读取properties文件的六种方法",但在Java应用中,最常用还是通过java.lang.Class类的getResourceAsStream(String name) 方法来实现,但我见到众多读取properties文件的代码中,都会这么干:

      

    InputStream in = getClass().getResourceAsStream("资源Name");

      

    这里面有个问题,就是getClass()调用的时候默认省略了this!我们都知道,this是不能在static(静态)方法或者static块中使用的,原因是static类型的方法或者代码块是属于类本身的,不属于某个对象,而this本身就代表当前对象,而静态方法或者块调用的时候是不用初始化对象的。

      

    问题是:假如我不想让某个类有对象,那么我会将此类的默认构造方法设为私有,当然也不会写别的共有的构造方法。并且我这个类是工具类,都是静态的方法和变量,我要在静态块或者静态方法中获取properties文件,这个方法就行不通了。

      

    那怎么办呢?其实这个类就不是这么用的,他仅仅是需要获取一个Class对象就可以了,那还不容易啊--               

    取所有类的父类Object,用Object.class难道不比你的用你正在写类自身方便安全吗 ?呵呵,下面给出一个例子,以方便交流。        

         

    1. import  java.util.Properties;    
    2. import  java.io.InputStream;    
    3. import  java.io.IOException;    
    4.   
    5. /**    
    6. * 读取Properties文件的例子    
    7. * File: TestProperties.java    
    8. * User: leizhimin    
    9. * Date: 2008-2-15 18:38:40    
    10. */     
    11. public   final   class  TestProperties {    
    12.      private   static  String param1;    
    13.      private   static  String param2;    
    14.   
    15.      static  {    
    16.         Properties prop =  new  Properties();    
    17.         InputStream in = Object. class .getResourceAsStream( "/test.properties" );    
    18.          try  {    
    19.             prop.load(in);    
    20.             param1 = prop.getProperty( "initYears1" ).trim();    
    21.             param2 = prop.getProperty( "initYears2" ).trim();    
    22.         }  catch  (IOException e) {    
    23.             e.printStackTrace();    
    24.         }    
    25.     }    
    26.   
    27.      /**    
    28.      * 私有构造方法,不需要创建对象    
    29.      */     
    30.      private  TestProperties() {    
    31.     }    
    32.   
    33.      public   static  String getParam1() {    
    34.          return  param1;    
    35.     }    
    36.   
    37.      public   static  String getParam2() {    
    38.          return  param2;    
    39.     }    
    40.   
    41.      public   static   void  main(String args[]){    
    42.         System.out.println(getParam1());    
    43.         System.out.println(getParam2());    
    44.     }    
    45. }   
    46.   
    47.      
    48.   
    49. 运行结果:  
    50.   
    51. 151    
    52. 152    

    当然,把Object.class换成int.class照样行,呵呵,大家可以试试。

      

    另外,如果是static方法或块中读取Properties文件,还有一种最保险的方法,就是这个类的本身名字来直接获取Class对象,比如本例中可写成TestProperties.class,这样做是最保险的方法

    2 获取路径的方式:

    1. File fileB = new File( this .getClass().getResource( "" ).getPath());  
    2.   
    3.  System. out .println( "fileB path: " + fileB);   


    2.2获取当前类所在的工程名:

    1. System. out .println("user.dir path: " + System. getProperty ("user.dir"))<span style="background-color: white;">3 获取路径的一个简单的Java实现</span>  
    1. /** 
    2.  
    3.      *获取项目的相对路径下文件的绝对路径 
    4.  
    5.      * 
    6.  
    7.      * @param parentDir 
    8.  
    9.      *目标文件的父目录,例如说,工程的目录下,有lib与bin和conf目录,那么程序运行于lib or 
    10.  
    11.      * bin,那么需要的配置文件却是conf里面,则需要找到该配置文件的绝对路径 
    12.  
    13.      * @param fileName 
    14.  
    15.      *文件名 
    16.  
    17.      * @return一个绝对路径 
    18.  
    19.      */  
    20.   
    21.     public static String getPath(String parentDir, String fileName) {  
    22.   
    23.         String path = null;  
    24.   
    25.         String userdir = System.getProperty("user.dir");  
    26.   
    27.         String userdirName = new File(userdir).getName();  
    28.   
    29.         if (userdirName.equalsIgnoreCase("lib")  
    30.   
    31.                 || userdirName.equalsIgnoreCase("bin")) {  
    32.   
    33.             File newf = new File(userdir);  
    34.   
    35.             File newp = new File(newf.getParent());  
    36.   
    37.             if (fileName.trim().equals("")) {  
    38.   
    39.                 path = newp.getPath() + File.separator + parentDir;  
    40.   
    41.             } else {  
    42.   
    43.                 path = newp.getPath() + File.separator + parentDir  
    44.   
    45.                         + File.separator + fileName;  
    46.   
    47.             }  
    48.   
    49.         } else {  
    50.   
    51.             if (fileName.trim().equals("")) {  
    52.   
    53.                 path = userdir + File.separator + parentDir;  
    54.   
    55.             } else {  
    56.   
    57.                 path = userdir + File.separator + parentDir + File.separator  
    58.   
    59.                         + fileName;  
    60.   
    61.             }  
    62.   
    63.         }  
    64.   
    65.    
    66.   
    67.         return path;  
    68.   
    69.     }  


    4 利用反射的方式获取路径:

      1. InputStream ips1 = Enumeration . class .getClassLoader() .getResourceAsStream( "cn/zhao/enumStudy/testPropertiesPath1.properties" );  
      2.   
      3.           
      4.   
      5.  InputStream ips2 = Enumeration . class .getResourceAsStream( "testPropertiesPath1.properties" );  
      6.   
      7.           
      8.   
      9.  InputStream ips3 = Enumeration . class .getResourceAsStream( "properties/testPropertiesPath2.properties" );  
      10.    
  • 相关阅读:
    IntelliJ IDEA 14.03 java 中文文本处理中的编码格式设置
    应聘感悟
    STL string分析
    CUDA SDK VolumeRender 分析 (1)
    BSP
    CUDA SDK VolumeRender 分析 (3)
    CUDA SDK VolumeRender 分析 (2)
    Windows软件发布时遇到的一些问题
    Ten Commandments of Egoless Programming (转载)
    复习下光照知识
  • 原文地址:https://www.cnblogs.com/toSeeMyDream/p/7655127.html
Copyright © 2011-2022 走看看