2013-05-16 44 views
2

我使用java.util.Properties#store()方法來我的屬性保存到一個文件時,過濾掉評論:寫屬性的文件

os = new BufferedOutputStream(new FileOutputStream(propertiesFile)); 
properties.store(os, null); 

此方法的默認實現總是寫評論與當前timestamp的第一行:

#Thu May 16 12:55:36 EDT 2013 

在我的應用程序中不需要此行爲,因爲我需要跟蹤屬性文件中的所有更改。是否有可能以某種方式從屬性文件中過濾此註釋行(以及所有其他行)?

我對「即時」解決方案特別感興趣,事後沒有對文件進行後期處理。

回答

2

是的,你可以:)。

首先,您可以擴展Properties並覆蓋store()方法。但這種方式太複雜了。

你可以做得更好。檢查store()的源代碼。它調用私人方法store()實際上完成了這項工作。這種方法在開始調用

bw.write("#" + new Date().toString());

。你不想看到這一行。這意味着你必須實現你自己的BufferedWriter,忽略第一行打印的行。現在

public class IgnoreFirstLineBufferedWriter extends BufferedWriter { 
    private int lineCouner = 0; 
    // constructors - implement them yourself 

    @Override 
    public void write(String str) throws IOException { 
     if (lineCounter > 0) { 
      super.write(str); 
     } 
     lineCounter++; 
    } 
} 

,你可以當你包裝一下你FileOutputStream並調用store()使用定製BufferedWriter:當您使用storeToXML方法

props.store(new IgnoreFirstLineBufferedWriter(new OutputStreamWriter(new FileOutputStream("myprops.properties"))));

+0

這將工作正常,除非我們將非空的第二個參數傳遞給存儲方法。不是我的情況,但它可以很好地改進它 – hoaz

0

此時間戳打印在屬性上的私有方法中,並且沒有屬性來控制該行爲。如果您想要更改此行爲,則可能需要對屬性進行子類化,覆蓋存儲方法並複製/粘貼store0方法的內容,以便不打印日期註釋。

+0

我不想重新發明輪子,編碼屬性名稱和值的代碼太多 – hoaz

+0

其他方法然後,從新創建的屬性文件中刪除第一行 –

0

不打印日期。但屬性將以XML格式存儲( )否則,最好的方法是擴展屬性類,如前所述