【问题标题】:How to do a search/replace on a file on the fly?如何动态搜索/替换文件?
【发布时间】:2012-02-09 23:22:23
【问题描述】:

我的 java 应用程序加载一个 XML 文件,然后解析 XML。

我想要在创建 SAXBuilder 之前搜索/替换文件。如何在内存中执行此操作(无需写入文件)?

这是我的代码,我设想在哪里进行搜索/替换:

private String xmlFile = "D:\\mycomputer\\extract.xml";
File myXMLFile = new File(xmlFile);

// TODO
// REPLACE ALL "<content>" in xmlFile with "<content><![CDATA["
// REPLACE ALL "</content>" with "]]></content>"

SAXBuilder builder =  new SAXBuilder("org.apache.xerces.parsers.SAXParser");

document = builder.build(new File(myXMLFile));

【问题讨论】:

  • 如何在不写入文件的情况下替换文件中的项目?

标签: java file replace io


【解决方案1】:

您自己回答了这个问题 - 将整个文件读入 StringBuilder,在其中执行替换,然后调用 SAXParser。

可以使用 StringReader 将字符串传递给 SAXBuilder:

StringBuilder sb = new StringBuilder ();
loadFIleContent (filePath, sb);
document = builder.build (new StringReader (sb.toString ()));

P.S.:跟进 theglauber 的回答:

如果文件非常大(~100Mb),将其完全读入内存并将其解析为 DOM 树是不切实际的。在这种情况下,您应该考虑使用 SAXParser 并将其替换为正在解析的文件。

【讨论】:

  • 我的 XML 文件大约 10MB,我觉得还不错。
  • 然后做好准备,解析后将需要额外的 ~100Mb 来将创建的 DOM 树保存在内存中。
【解决方案2】:

您可以先使用apache commons io 将文件读取为字符串,然后更改SaxBuilder 的输入源,如下面的代码sn-p:

String fileStr = FileUtils.readFileToString(myXMLFile);
fileStr = fileStr.replaceAll("<content>","<content><![CDATA[");
fileStr = fileStr.replaceAll("</content>","]]></content>");
SAXBuilder builder =  new SAXBuilder("org.apache.xerces.parsers.SAXParser");
document = builder.build(new ByteArrayInputStream(fileStr.getBytes()));

【讨论】:

  • 最好使用 StringReader 而不是 ByteArrayInputStream 以避免使用 String.getBytes 如果文件很大的话会产生内存开销。
【解决方案3】:

根据这些文件的大小,将文件读入字符串,在内存中进行替换并从字符串构建 XML,或者生成一个新线程来读取文件,进行替换和输出,然后构建该线程输出的 XML。

(我建议解析和修改 XML 树或使用 XML 过滤器,但我怀疑您想要进行这种基于字符串的替换,因为您的文件的当前内容不是正确的 XML。)

【讨论】:

    【解决方案4】:

    将文件读入内存,进行搜索/替换,然后使用 SAXBuilder(StringReader) 方法。

    【讨论】:

      猜你喜欢
      • 2013-06-13
      • 1970-01-01
      • 2022-01-07
      • 1970-01-01
      • 2011-07-17
      • 2016-01-14
      • 1970-01-01
      相关资源
      最近更新 更多