天天看點

實作對properties檔案的有序讀寫

實作對properties檔案的有序讀寫

         最近遇到一項需求,要求把properties檔案中的内容讀取出來供使用者修改,修改完後需要再重新儲存到properties檔案中。很簡單的需求吧,可問題是Properties是繼承自HashTable的,直接通過keySet()、keys()或entrySet()方法對Properties中的元素進行周遊時取出來的内容順序與properties檔案中的順序不一緻,這是問題一;問題二是就算取出來的時候是有序的,儲存到檔案中時又是無序的了。

         當然,解決這兩個問題的方法有很多。我最終采用的方法是自定義一個PropertiesUtil類,該類繼承自Properties。PropertiesUtil提供一個傳回由key按照存入順序組成的List的方法,getKeyList(),這樣問題一就解決了。那如何保證getKeyList()方法傳回的就是有序的key組成的集合呢?我檢視了一下Properties方法的源碼,發現其setProperty()方法實際上就是調用了父類HashTable的put()方法,其次Properties在從檔案中加載内容時是按照檔案順序進行讀取,然後調用父類HashTable的put()方法進行儲存。是以問題的解決辦法就是PropertiesUtil持有一個私有的可以有序存儲key的集合,然後重寫父類的put()方法,在方法體中照常通過super.put()進行屬性的存儲,同時将key添加到存儲key的集合中。

         Properties提供有save()方法和store()方法可以将目前對象的内容存放到指定的輸出流中,但它們的底層邏輯都是一樣的。通過調用keys()方法擷取一個Enumeration,然後對該Enumeration進行周遊,依次将對應的key和value寫入到輸出流中,是以要保證寫入是有序的,就要保證周遊keys()傳回的Enumeration時取出的元素key是有序的。是以解決方法是重寫keys()方法,保證周遊傳回的Enumeration時得到的key是有序的。完整代碼如下: