编辑:这些文件发布到我正在处理的网络服务器上,我现在手头没有,只有“代表性样本”。
我有大的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放好。如果它至关重要,我可以尝试从中抽出一堆东西来为互联网消毒。我认为其中可能有一些专有的东西。
答案 0 :(得分:1)
TXT + =行;
concat运算符创建一个包含左侧和右侧串联的新字符串。这涉及复制两个操作数中的所有字符。例如,在该循环的第1000次迭代中,它将复制txt的当前内容和行的内容。这是该文件的前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");
}
}
}