在Java中用许多文件替换许多字符串标记的最有效方法是什么?

时间:2009-08-11 18:53:17

标签: java algorithm performance replace

我想要实现的是一个过滤我的文件的工具,用这个格式${some.property}替换字符串的出现,其中的值来自属性文件(就像Maven或Ant的文件过滤功能一样)。

我的第一种方法是使用Ant API(复制任务)或Maven过滤组件,但两者都包含许多不必要的依赖项,我的程序应该是轻量级的。之后,我在Apache Common中搜索了一下还没找到任何东西。

我的问题是否有效(优雅)解决方案?

3 个答案:

答案 0 :(得分:2)

最有效的解决方案是使用模板引擎。很少有广泛使用的引擎,只需一个罐子就可以了:

答案 1 :(得分:1)

如果这与配置相关,我建议Apache Commons Configuration。它会即时进行变量替换。

它还有其他很好的功能,比如处理XML,属性,Apple的pList格式。

答案 2 :(得分:0)

执行此操作的最快且最不受阻碍的方法是编写自己的方法。它不应该那么艰难 - 可能需要花费几个小时来编写测试并将代码放在一起。

建议的算法:

首先将属性文件加载到Properties对象中。

使用输入阅读器(如果您要从具有高延迟的源读取文件,请使用BufferedReader),并抓取每个字符,寻找{。如果字符不是{,则将字符发送到输出流。如果找到{,则开始扫描},在StringBuilder中累积字符。如果你点击另一个{,请将StringBuilder刷新到输出流并重新开始。您可能希望拥有允许属性键包含的最大字符数。如果达到该限制,请将StringBuilder刷新到输出流。

如果找到{}包围的令牌,请获取密钥名称并执行Properties#getProperty()调用。如果得到结果,则将结果发送到输出流。如果您没有得到结果,请做一些不同的事情。

如果你想变得聪明,一旦你得到结果,而不是直接将结果发送到输出流,预先将它挂起到输入流(不是字面上 - 你做一些逻辑使其工作) ,并继续。这样,如果任何属性本身引用其他属性,则该算法有效地递归。

如果您真的想要表现,可以使用ByteBuffer而不是输入流/写入器