0

编辑:这些文件被发布到我正在处理的网络服务器上,我现在手头没有它们,只有一个“代表性样本”。

我有很大的 kml 文件(大小 80000 行),可能更大,其中包含 xml 和 html,我需要在 xml 的特定元素上找到替换。

<href>some_random_file_name<href>

我需要将那里的值替换为我尝试过使用类似于此的值:

http://www.mkyong.com/java/how-to-modify-xml-file-in-java-dom-parser/

但是发现 html 导致解析器出错并且找不到我想要的元素。

现在我正在逐行遍历文件并寻找我想要的元素,但这非常慢。我需要一种相对有效的方法来处理这个问题。

迭代代码:

            File kml = new File(kmlFile);
        FileReader reader = new FileReader(kml);
        BufferedReader br = new BufferedReader(reader);
        String txt="";
        String line = null;
        while((line = br.readLine())!= null) {
            if(line.contains("href")) {
                String tmp = line.replace("<href>","");
                tmp = tmp.replace("</href>","");
                tmp = tmp.replaceAll("\t", "");
                tmp = tmp.replaceAll("images/", "");
                line = "<href>"+namesToIds.get(tmp)+"</href>";
            }
            txt+=line;
        }

        br.close();
        FileWriter writer = new FileWriter(kml);
        BufferedWriter bw = new BufferedWriter(writer);
        bw.write(txt);
        bw.flush();
        bw.close();

我不认为我现在可以提出 kml。如果这很重要,我可以尝试从中取出一堆东西来为互联网消毒。我认为其中可能有一些专有的东西。

4

1 回答 1

1

txt+=行;

concat 运算符创建一个新字符串,其中包含左侧和右侧的连接。这涉及复制两个操作数中的所有字符。例如,在此循环的第 1000 次迭代中,它将复制 txt 的当前内容和 line 的内容。这是文件的前 1001 行。换句话说,如果文件中有 n 行,您将复制一行文本 n * (n + 1) / 2 次。当然,一遍又一遍地复制相同的行并不是最有效的方法。

相反,您应该将转换后的文本累积在 StringBuilder 中,或者更好的是,不要累积在内存中,而是将每一行添加到您转换后的输出文件中。

就像是:

try (BufferedReader reader = new BufferedReader(new FileReader(kmlFile))) {
    try (BufferedWriter writer = new BufferedWriter(new FileWriter(outputFile))) {
        String line = null;
        while((line = br.readLine())!= null) {
            writer.write(convert(line));
            writer.write("\n");
        }
    }
}
于 2013-10-24T21:14:37.683 回答