Thread.currentThread().getContextClassLoader().getResourceAsStream()讀取配置文件



  Java中使用的路徑,分為兩種:絕對路徑和相對路徑。具體而言,又分為四種:
  一、URI形式的絕對資源路徑

  如:file:/D:/java/eclipse/workspace/j/bin/a

  URL是URI的特例。URL的前綴/協議,必須是Java熟悉的。URL可以打開資源,而URI則不行。
  URL和URI對象可以互相轉換,使用各自的toURI(),toURL()方法即可!

  二、本地系統的絕對路徑
  D:/java/eclipse/workspace/j/bin/a
  Java.io包中的類,需要使用這種形式的參數。
  但是,它們一般也提供了URI類型的參數,而URI類型的參數,接受的是URI樣式的String。因此,通過URI轉換,還是可以把URI樣式的絕對路徑用在java.io包中的類中。


  三、相對於classpath的相對路徑
  如:相對於
  file:/D:/java/eclipse/workspace/j/bin/這個路徑的相對路徑。其中,bin是本項目的classpath。所有的Java源文件編譯后的.class文件復制到這個目錄中。

  四、相對於當前用戶目錄的相對路徑
  就是相對於System.getProperty("user.dir")返回的路徑。
  對於一般項目,這是項目的根路徑。對於JavaEE服務器,這可能是服務器的某個路徑。這個並沒有統一的規范!
  所以,絕對不要使用"相對於當前用戶目錄的相對路徑"。然而:
  默認情況下,java.io 包中的類總是根據當前用戶目錄來分析相對路徑名。此目錄由系統屬性 user.dir 指定,通常是 Java 虛擬機的調用目錄。
  這就是說,在使用java.io包中的類時,最好不要使用相對路徑。否則,雖然在J2SE應用程序中可能還算正常,但是到了J2EE程序中,一定會出問題!而且這個路徑,在不同的服務器中都是不同的!

      下面是我在學習過程中比較好的一種讀取classpath文件的一個好方法

 

 

private static Properties props = new Properties();
public static String getUrl(String fileName, String key) {
    if (isBlank(fileName)) {
        logger.warn("配置文件不存在:{}", fileName);
    } else {
        try {
            //得到當前的classpath的絕對路徑的URI表示法。
            InputStream stream = Thread.currentThread().getContextClassLoader().getResourceAsStream(fileName);
            //讀取Properties文件
            props.load(stream);
            return props.getProperty(key);
        } catch (IOException e) {
            e.printStackTrace();
            return "";
        }
    }
}
//判斷fileName是否有空格
public static boolean isBlank(String str) {
    int length;
    if (str != null && (length = str.length()) != 0) {
        for(int i = 0; i < length; ++i) {
            if (!Character.isWhitespace(str.charAt(i))) {
                return false;
            }
        }
        return true;
    } else {
        return true;
    }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM