我想要实现的是一个过滤我的文件的工具,用这个格式${some.property}
替换字符串的出现,其中的值来自属性文件(就像Maven或Ant的文件过滤功能一样)。
我的第一种方法是使用Ant API(复制任务)或Maven过滤组件,但两者都包含许多不必要的依赖项,我的程序应该是轻量级的。之后,我在Apache Common中搜索了一下还没找到任何东西。
我的问题是否有效(优雅)解决方案?
答案 0 :(得分:2)
最有效的解决方案是使用模板引擎。很少有广泛使用的引擎,只需一个罐子就可以了:
答案 1 :(得分:1)
如果这与配置相关,我建议Apache Commons Configuration。它会即时进行变量替换。
它还有其他很好的功能,比如处理XML,属性,Apple的pList格式。
答案 2 :(得分:0)
执行此操作的最快且最不受阻碍的方法是编写自己的方法。它不应该那么艰难 - 可能需要花费几个小时来编写测试并将代码放在一起。
建议的算法:
首先将属性文件加载到Properties对象中。
使用输入阅读器(如果您要从具有高延迟的源读取文件,请使用BufferedReader),并抓取每个字符,寻找{。如果字符不是{,则将字符发送到输出流。如果找到{,则开始扫描},在StringBuilder中累积字符。如果你点击另一个{,请将StringBuilder刷新到输出流并重新开始。您可能希望拥有允许属性键包含的最大字符数。如果达到该限制,请将StringBuilder刷新到输出流。
如果找到{}包围的令牌,请获取密钥名称并执行Properties#getProperty()调用。如果得到结果,则将结果发送到输出流。如果您没有得到结果,请做一些不同的事情。
如果你想变得聪明,一旦你得到结果,而不是直接将结果发送到输出流,预先将它挂起到输入流(不是字面上 - 你做一些逻辑使其工作) ,并继续。这样,如果任何属性本身引用其他属性,则该算法有效地递归。
如果您真的想要表现,可以使用ByteBuffer而不是输入流/写入器