2012-04-13 62 views
1

我加載一個道具,並將其保存文件加載

File propfile=new File(getClass().getResource("credentials.properties").toURI()); 
       prop.load(new FileInputStream(propfile)); 
      prop.setProperty("a", username); 
      prop.setProperty("c", password); 
      prop.setProperty("b", pbKey); 
      prop.store(new FileOutputStream(propfile), null); 

當我正常運行這在NetBeans以其優良的,當其捆綁到.jar文件,它拋出

Caused by: java.lang.IllegalArgumentException: URI is not hierarchical 
    at java.io.File.(Unknown Source) 

現在,當我使用

getClass().getResourceAsStream("credentials.properties"); 

我可以閱讀FIL E,但我無法保存文件,除非我用的是.toURI() 在 - >Storing changes in .properties file that has been read via getClass().getResourceAsStream

所以當我使用toURI(),當我運行它(jar文件),它會大叫說的URI is not hierarchical

當我使用getResourceAsStream,我無法保存文件

我該怎麼辦? 屬性文件在同一個包中的類是在

+0

@ cypronmaya:爲什麼程序需要修改jar文件?我想你需要重新審視需求/設計。考慮一下這個jar根本不可寫的情況。 – Jayan 2012-04-13 07:48:28

+0

@Jayan我試圖建立一個桌面應用程序,其中一些參數由用戶設置,如他們的用戶名/密碼等,有點,實施,我想使用屬性文件becoz更容易。 – cypronmaya 2012-04-13 07:52:04

+0

@ cypronmaya:您可以在jar中的屬性中設置某種默認值。將修改後的內容另存到其他位置,例如$ {user.home}。 – Jayan 2012-04-13 07:54:50

回答

4

如果你只需要負載的屬性,你不應該使用File在所有 - 你應該使用getResourceAsStream

如果您需要保存屬性返回,您不能輕易地將它們放入jar文件中。你需要在每次保存時重建jar文件 - ick!

如果你真的兩者都需要,你可能要考慮具有創建第一次您需要保存更改的文件:加載時,使用的文件,如果它的存在,但在jar文件中使用的版本除此以外。

編輯:如果你正在建立一個桌面應用程序,這些基本上是用戶的喜好,你應該看看Preferences API。如果你正在存儲密碼,也要小心 ......如果可能,請避免這樣做。

+0

你會介意,如果你可以詳細說明最後一部分'如果你真的需要這兩個.......' – cypronmaya 2012-04-13 07:49:49

+0

@cypronmaya:你不明白哪一點建議?你確實需要保存更改嗎?假設你*不想*開始重寫jar文件,你有適當的地方可以保存新的屬性文件嗎? – 2012-04-13 07:52:14

+0

你說'你可能想考慮讓你第一次創建一個文件,你需要保存更改'以保存更改?我無法做到這一點,是的,我需要保存更改至少臨時文件,直到程序關閉等, – cypronmaya 2012-04-13 07:56:08

1

嘗試:

File userFile = new File(System.getProperty("user.home"), "myProgram.properties"); 
if(userFile.exists()) { 
    prop.load(new FileInputStream(userFile)); 
} else { 
    prop.load(getClass().getResourceAsStream("credentials.properties")); 
} 

prop.setProperty("a", username); 
prop.setProperty("c", password); 
prop.setProperty("b", pbKey); 
prop.store(new FileOutputStream(userFile), null); 

(注意的user.home不起作用每次每臺機器上,但接下來應該努力每一次。)

+1

*「user.home不適用於所有平臺。」*新聞給我。它以什麼方式「不起作用」?在哪些平臺上? – 2012-04-13 08:04:33

+0

@AndrewThompson我已經看到它不工作了。雖然'平臺'在這裏是錯誤的詞(我會編輯它)看到這個問題作爲例子:http://stackoverflow.com/questions/1503284/java-system-getpropertyuser-home-returns – 2012-04-13 08:06:47