【问题标题】: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 中:

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

        执行此操作的最快和最省事的方法是自己编写。应该没那么难 - 可能需要几个小时来编写测试并将代码放在一起。

        建议的算法:

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

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

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

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

        如果您真的想提高性能,您可以使用 ByteBuffer 代替输入流/写入器

        【讨论】:

          猜你喜欢
          • 2011-07-25
          • 1970-01-01
          • 2013-07-26
          • 1970-01-01
          • 2012-05-03
          • 2022-06-17
          • 2018-03-28
          • 2010-10-17
          相关资源
          最近更新 更多