2012-02-17 64 views
2

我試圖加載屬性,如果它不存在創建一個。加載屬性,如果不存在 - 創建它

好了,下面是裝載:

InputStream is = Store.class.getResourceAsStream("my.properties"); 
props.load(is); 

,但難的是確定的,如果不存在的文件,並創建它,如果必要

嘗試這一個:

File conf = null; 
try { 
     conf = new File(Store.class.getResource("my.properties").getFile()); 
} 
catch (Exception e){ 
    // can't create file because getResource returns null again 
    conf = new File(Store.class.getResource("my.properties").getFile()); //WRONG 
    conf.createNewFile(); 
} 

我可以在這種情況下做?

+2

http://docs.oracle.com/javase/1.4。2/docs/api/java/io/File.html#exists%28%29 – hovanessyan 2012-02-17 12:55:55

+0

@hovanessyan您不能使用exists方法,因爲conf將爲空 – VextoR 2012-02-17 12:57:31

+0

您使用的構造函數:http://docs.oracle.com /javase/1.4.2/docs/api/java/io/File.html#File%28java.lang.String%29 – hovanessyan 2012-02-17 13:02:28

回答

3

實際上,如果該文件不存在,getResource方法將返回null,因此您將在try和catch catch塊內獲得NullPointerException

我真的不知道是否是無論如何可以創建所需的文件,因爲首先你需要它的完整路徑,你不能得到,因爲該方法getResourcegetResourceAsStream將返回null

你可以做的是讓已經在同一文件夾中存在其他資源文件的路徑,並用它來獲取父文件夾的路徑,然後將需要的文件名添加到它。

final File myfile = new File(new File(BooleanFact.class.getResource("existingfile").getFile()).getParentFile(), "myfile"); 
myfile.createNewFile(); 

但是你應該注意到項目資源實際上並不打算在運行時創建。它們應該在開發時添加,通常只能讀(不能修改)。 如果您需要某些文件在運行時更新,則應使用普通文件系統。

+0

確切,這就是爲什麼我堅持) – VextoR 2012-02-17 13:10:31

2

我在想一個問題是,你裝的屬性作爲一種資源,從classpath因此通常。如果你的應用程序是作爲jar分發的,你想要做什麼?你想在哪裏創建文件?

因此,也許你可以這樣做:如果文件在類路徑中存在,比加載它作爲一種資源

  • (它纔有意義,如果你的罐子,或者類路徑的另一個罐子,包含屬性文件)
  • 如果它不存在,你必須選擇一個文件夾(用戶的「家庭文件夾」內的東西也許?),然後看看文件是否存在
  • 如果文件存在,您可以加載使用FileInputStream而不是來自資源的屬性
  • 如果fi文件不存在,你可能想自己創建它,併爲屬性編寫「默認」值。
3

getResourcegetResourceAsStream可以從你的classpath任何地方加載資源。您不應該認爲它甚至是文件系統中的文件,因爲它可以位於.jar文件中。因此,如果文件丟失,您不應該嘗試創建該文件。

相反,如果你想從文件系統加載的文件,你應該知道你想從加載它的位置。您也可以考慮一種混合方法,首先嚐試從資源加載它,如果找不到,則從文件系統中的特定位置加載並在文件丟失時創建該文件。

相關問題