2010-01-08 119 views
14

我試圖存儲到我的應用程序的屬性所做的更改。 .properties文件位於resources程序包中,該程序包與包含我的用戶界面和模型的程序包不同。的Java的OutputStream摺合的getClass()。getClassLoader()。的getResourceAsStream()

我打開使用包:

this.getClass().getClassLoader().getResourceAsStream("resources/settings.properties") 

是否有這個功能相當於允許我堅持在同一屬性文件更改屬性類?

回答

2

這聽起來像你想存儲用戶偏好。考慮使用Java Preferences API

+8

如何選擇此答案?它不是回答這個問題,而是建議以另一種方式進行。即使這樣做的另一種方式更好,也不會回答原來的問題。你應該做的是回答問題,然後提出一種替代方法。 – 2015-04-30 01:56:54

+1

@FukuzawaYukio:解決問題而不是回答問題在這種情況下更有用。請注意,答案是由提問問題的人選擇的,因此看起來他們也這麼認爲。 – 2015-04-30 08:19:48

5

當您纏繞你的應用程序了作爲一個JAR文件,屬性文件將是一個(可能是壓縮),該JAR文件中,這將是一個壞主意,嘗試寫你自己的JAR。

getResourceAsStream()是爲了打開閱讀資源,而這些可以在類路徑的任何地方。您無法寫入URL或JAR內部,只能寫入文件,因此爲輸出提供相同的API沒有任何意義。

發現自己你可以寫入到一個目錄,並有寫你的屬性。

這可能是你的屬性從安裝的類路徑(可能是一個JAR內)直接複製到一個文件,如果它不存在,因爲在應用程序啓動的第一動作是一個好主意。這會給你一個你可以寫入的屬性文件,但這個屬性文件的主副本將來自你的項目可交付成果。

0

除了Carl's answer,如果您要頻繁地讀寫此文件,並期望您的應用程序將擴大範圍,請考慮是否要進一步執行一個步驟(或多個步驟)並使用文件 - 基於數據庫的數據庫,如SQLite。有幾個用於SQLite的JDBC封裝器,它允許您超越Java Properties接口提供的基本字符串鍵值查找。

7

在「資源」包,這是不同從包含我的UI和模型包。

您應該使用上下文的類加載器。

ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); 
properties.load(classLoader.getResourceAsStream("resources/settings.properties")); 

是否有這個功能相當於允許我堅持在同一屬性文件更改屬性類?

您需要Properties#store()這一點,它可以採取或者OutputStreamWriter。首先,你需要獲取屬性文件的URL並獲得其URI,這樣就可以創建這個您在FileOutputStream包裝一個File

URL url = classLoader.getResource("resources/settings.properties"); 
properties.store(new FileOutputStream(new File(url.toURI())), null); 
+0

感謝您的幫助。 – craig 2010-01-11 00:08:20

+0

通過這種方式,jar文件的URI不是分層的,有一個問題。任何可能的想法來解決它? – xXxpRoGrAmmErxXx 2017-04-18 02:26:35

23

一般情況下,你不能把東西放回你的類加載器有一個資源:

  • 類加載資源往往只讀;即保持在只讀文件/只讀目錄中。

  • 如果您從JAR文件獲取資源,JAR文件不會簡單更新。 (要「更新」,你需要提取舊的JAR的內容並創建一個新的JAR以及更新後的內容,這些都與ZIP文件的結構有關......)

  • 在某些情況下,類加載器資源將被即時下載,並且無法將更改推回到您下載的位置。

即使您可以更新您從類加載器獲得的資源,這是一個糟糕的主意/不好的做法。

  • 這樣做會污染干淨的應用程序安裝和用戶的偏好。除此之外,這意味着安裝不能與其他用戶共享(除非您處理多個用戶的偏好...)。

  • 將應用程序安裝爲可寫入存在安全問題,以便可以更新嵌入式偏好設置。想想病毒!認爲一個用戶可能傾向於濫用其他用戶的偏好!

  • 存在具有用戶特定應用程序副本的管理問題。如果用戶必須安裝他自己的應用程序副本,那麼也存在潛在的安全問題。

最後,這不是系統管理員(和受過教育的用戶)期望軟件行爲的方式。這是應對用戶的喜好以預期的方式最佳實踐:

  • 對於Java爲中心的解決方案使用Java Preferences API

  • 或者,您可以將write a Properties file包含在OS適當的用戶可寫目錄中。

  • 在Windows上,您可以使用特定於Windows的API將首選項存儲在Windows註冊表(yuck)中。

+0

大+1。明智的話。 – 2010-01-09 00:42:27

+0

感謝您的想法。 – craig 2010-01-09 21:47:45

相關問題