2009-08-11 43 views
0

我想要完成的是一個工具,它使用從屬性文件獲取的值(就像Maven或Ant的文件過濾功能)來替換此格式的字符串${some.property}以替換出現的字符串。什麼是最有效的方法來取代Java中的許多文件中的許多字符串標記?

我的第一種方法是使用Ant API(copy-task)或Maven Filtering組件,但都包含許多不必要的依賴項,我的程序應該是輕量級的。之後,我在Apache Common中搜索了一下還沒有發現任何東西。

有沒有一個有效的(和優雅的)解決我的問題?

回答

2

最有效的解決方案是使用模板引擎。很少有,廣泛使用的發動機,這是在一個單一的罐子:

1

如果這樣的配置有關,我會建議Apache Commons Configuration 。它將在飛行中進行可變更換。

它還有其他很好的功能,如處理XML,屬性,Apple的pList格式。

0

做到這一點的最快速和最不受歡迎的方式將是編寫自己的。它不應該那麼艱難 - 可能需要幾個小時才能編寫測試並將代碼放在一起。

一個建議的算法:

開始通過加載屬性文件到Properties對象。

取一個輸入閱讀器(如果您將從高延遲源讀取文件,請使用BufferedReader),並抓住每個字符,查找{。如果該字符不是{,則將該字符發送到輸出流。如果你發現一個{,開始掃描一個},在一個StringBuilder中累積這些字符。如果你點擊另一個{,將StringBuilder刷新到輸出流並重新開始。您可能希望有一些允許屬性鍵包含的最大字符數。如果您達到該限制,請將StringBuilder刷新到輸出流。

如果您發現由{}包圍的令牌,請抓住密鑰名稱並執行Properties#getProperty()調用。如果得到結果,則將結果發送到輸出流。如果你沒有得到結果,就做一些不同的事情。

如果你想變得聰明,一旦你得到結果,而不是直接發送結果到輸出流,預先將它掛到輸入流(不是字面上 - 你會做一些邏輯來使它工作),並繼續。這樣,如果任何屬性本身引用其他屬性,則該算法會有效地遞歸。

如果你真的想要表現,你可以使用ByteBuffer代替輸入流/寫入器

相關問題