2012-01-08 88 views
1

我最近發現了約java.util.Properties,它允許我編寫和讀取配置,而無需編寫自己的函數。如何將Properties.store()分隔符從「=」更改爲「:」?

我很興奮,因爲它很容易使用,但後來發現一個缺陷,當我存儲修改後的配置文件。

這裏是我的代碼,很簡單,現在:

FileWriter writer = null; 
Properties configFile = new Properties(); 
configFile.load(ReadFileTest.class.getClassLoader().getResourceAsStream("config.txt")); 

String screenwidth = configFile.getProperty("screenwidth"); 
String screenheight = configFile.getProperty("screenheight"); 
System.out.println(screenwidth); 
System.out.println(screenheight); 
configFile.setProperty("screenwidth", "1024"); 
configFile.setProperty("screenheight", "600"); 
try { 
    writer = new FileWriter("config.txt"); 
    configFile.store(writer, null); 
} catch (IOException e) { 
    e.printStackTrace(); 
} 
writer.flush(); 
writer.close(); 

我注意到的問題是,該配置文件我嘗試編輯存儲這樣的:

foo: bar 
bar: foo 
foobar: barfoo 

但是,輸出properties.store(writer, null)後是這樣的:

foo=bar 
bar=foo 
foobar=barfoo 

的配置文件編輯我是不是我的程序,對於需要配置文件的其他應用程序,其格式爲:作爲分隔符,否則會將配置重置爲默認值。

有人知道如何輕易改變這個嗎?

我現在搜索了前5個Google頁面,但發現沒有人遇到類似的問題。 我也檢查了Javadoc,發現沒有任何功能可以讓我在沒有爲自己編寫課程的情況下改變它。 我想現在使用Properties,因爲它在那裏並且很容易使用。 我也想到了在保存文件後,將=全部替換爲:,但也許有人得到了更好的建議?

回答

2

請勿使用未針對任務設計的工具 - 請勿在此處使用Properties。相反,我只是寫自己的 - 應該很容易。

您仍然可以使用Properties實例作爲「存儲」,但不要將其用於將屬性序列化爲文本。相反,只需使用FileWriter,遍歷這些屬性,然後自己寫行 - 如key + ": " + value

+0

這是一個不錯的主意,我只是使用Properties來讀取文件和一個FileWriter來存儲它,謝謝你現在就試試。 – user1137183 2012-01-08 15:35:59

+0

但是,請檢查Properties.saveConvert()和loadConvert()是如何轉義特殊字符的。這對你來說可能是一個重大問題。 – user949300 2012-01-28 02:24:25

0

新的想法在這裏

您對轉換=要評論:讓我想:Properties.store()寫入到流。您可以使用內存中的ByteArrayOutputStream,在之前將內存轉換爲適當的內容,然後寫入文件。同樣對於Properties.load()。或者你可以插入FilterXXXs。 (我可能會在記憶中)。


我正在研究子類是多麼的困難。這幾乎是不可能的。 :(

如果你看一下Properties的源代碼,我正在看Java 6 store()調用store0()。現在,不幸的是,store0是私有的,沒有被保護,「=」它是一個魔術常數,不是從屬性讀取的,它調用另一個叫做save​​Convert()的私有方法,它也有很多魔術常量。幾乎所有的優秀代碼和良好風格的規則。

但是,它是開源的,因此,從理論上講,您可以將一堆代碼複製並粘貼(並改進!)到您自己的BetterProperties類中。