2012-04-06 35 views
0

我想加載一個屬性文件。
我有屬性文件在同一目錄作爲我試圖加載它的類。
例子:Java:無法加載屬性文件。爲什麼?

package com.classes.internal; 
public class ClassA { 

    private static String PFILE = "config.properties"; 


    private static void methodA(){ 
    //do stuff 
     Properties properties = null; 
     try{ 
      properties = new Properties(); 
      properties.load(new FileInputStream(PFILE)); 
      //properties.load(new ClassA().getClass().getResourceAsStream(PFILE)); --> Does not work either 

     }catch(Exception e){ 
      e.printStackTrace(); 
     } 


    } 

而且config.properties文件在COM \類\內部DIR

但我得到一個FileNotFoundExceptionjava.lang.NullPointerException(如果使用的是註釋掉行,而不是第一)

什麼我在這裏做錯了嗎?我在誤解什麼?

+0

哪裏是相對特性文件來你的類路徑? – 2012-04-06 07:08:20

+0

它與'ClassA'在同一個目錄下 – Jim 2012-04-06 07:11:21

+0

類似的問題:http://stackoverflow.com/questions/7688710/scanner-no-line-found-exception/7689102#7689102 – Sorin 2012-04-06 07:12:37

回答

2

該文件需要位於您執行的目錄中,而不是類文件所在的目錄。

所以,如果你有目錄結構

項目/ COM /班/內部

,並運行此命令

Project$ java com.classes.internal.SomeClass 

你的JVM會尋找「配置.properties「文件放在」Project「目錄下。

+0

我不知道我明白這一點。但那麼getClass()。getResourceAsStream'等是什麼意思? – Jim 2012-04-06 07:35:12

+0

'getClass()。getResourceAsStream'正在尋找存儲當前類的源文件的文件夾中的文件。嘗試執行'System.out.println(new ClassA()。getClass()。getResourceAsStream(「config.properties」));'通過將'config.properties'文件放在文件夾中,如前所述。 – mtk 2012-04-13 16:09:59

0

我認爲你的程序工作目錄不在com \ classes \ internal中。嘗試通過這個相對路徑:

com\classes\internal\config.properties 

或絕對路徑。 可以得到這樣的

String currentDir = new File(".").getAbsolutePath(); 
0
properties.load(this.getClass().getResourceAsStream(
    "/com/classes/internal/" + PFILE)); 
+0

沒有'this'.I'靜態'方法 – Jim 2012-04-06 07:33:10

+0

..以及當您使用更早的表單時,發生了什麼變化的位置字符串?請注意,我不喜歡玩'20個問題' - 在提供答案時使用一點主動權就值得。 – 2012-04-06 14:44:47

0

當前工作目錄下的線相對文件會自動裝載到工作目錄(在FrankieTheKneeMan例如,「項目」文件夾。如果你在Tomcat上運行的代碼,它很可能從$ Tomcat/bin /):

properties.load(new FileInputStream(PFILE)); 

對於下面的行,它是加載文件相對於您的類路徑。所以「config.properties」是指包含你的「com」文件夾而不是「com/classes/internal /」的目錄。

properties.load(new ClassA().getClass().getResourceAsStream(PFILE)); 

所以你需要決定是從classpath加載還是從工作目錄加載。

+0

我試過第二個選項,它沒有工作 – Jim 2012-04-06 10:15:06

0

示例。我使用的Eclipse項目結構,我希望你得到的圖片反正:

//File in Project/src/com/classes/internal/config.properties 
InputStream in = ClassA.class.getResourceAsStream("config.properties"); 
Properties p = new Properties(); 
try { 
    p.load(in); 
} catch(IOException e) { 
    e.printStackTrace(); 
} 

如果你決定把你的文件外面包:

//File in Project/src/config.properties 
InputStream in = ClassA.class.getClassLoader().getResourceAsStream("config.properties"); 

注意getResourceAsStream文件必須包含在你的類路徑。

0

直接創建配置包中的源文件夾和放置config.properties它文件。在構建應用程序,它會去/WEB-INF/classes/config/config.properties

然後,您可以使用下面的代碼來訪問屬性文件 -

Properties prop = new Properties(); 
    String propFileName = "/config/config.properties"; 

    InputStream input = null; 

    input = ClassA.class.getResourceAsStream(propFileName); 
    prop.load(input);