如何动态搜索/替换文件?

时间:2012-01-13 19:15:37

标签: java file replace io

我的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));

4 个答案:

答案 0 :(得分: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并替换为正在解析的文件。

答案 1 :(得分:1)

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

答案 2 :(得分:1)

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

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()));

答案 3 :(得分:0)

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

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