【问题标题】:What is the most efficient way to replace many string tokens in many files in Java?在Java中替换许多文件中的许多字符串标记的最有效方法是什么?
【发布时间】:2010-11-18 17:39:14
【问题描述】:
我想要完成的是一个过滤我的文件的工具,用从属性文件中获得的值替换这种格式的字符串 ${some.property}(就像 Maven 或 Ant 的文件过滤功能一样)。
我的第一种方法是使用 Ant API(复制任务)或 Maven 过滤组件,但两者都包含许多不必要的依赖项,我的程序应该是轻量级的。之后,我在 Apache Common 中搜索了一下,还没有找到任何东西。
我的问题是否有有效(且优雅)的解决方案?
【问题讨论】:
标签:
java
algorithm
performance
replace
【解决方案1】:
最有效的解决方案是使用模板引擎。很少有广泛使用的引擎放在一个 jar 中:
【解决方案3】:
执行此操作的最快和最省事的方法是自己编写。应该没那么难 - 可能需要几个小时来编写测试并将代码放在一起。
建议的算法:
首先将属性文件加载到 Properties 对象中。
获取一个输入阅读器(如果您要从具有高延迟的源读取文件,请使用 BufferedReader),并抓取每个字符,寻找一个 {。如果字符不是 {,则将字符发送到输出流。如果找到 {,开始扫描 },在 StringBuilder 中累积字符。如果您点击另一个 {,则将 StringBuilder 刷新到输出流并重新开始。您可能希望拥有允许属性键包含的最大字符数。如果达到该限制,请将 StringBuilder 刷新到输出流。
如果您发现一个被 {} 包围的令牌,请获取密钥名称并执行 Properties#getProperty() 调用。如果得到结果,则将结果发送到输出流。如果您没有得到结果,请做一些不同的事情。
如果你想变得更聪明,一旦你得到结果,而不是将结果直接发送到输出流,而是预先将它附加到输入流(不是字面意思 - 你会做一些逻辑让它工作) , 并继续。这样,如果任何属性本身引用其他属性,算法就会有效地递归。
如果您真的想提高性能,您可以使用 ByteBuffer 代替输入流/写入器