EDIT: эти файлы отправляются на веб-сервер, над которым я работаю, сейчас у меня их нет, только "репрезентативная выборка".
У меня есть большие файлы 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 прямо сейчас. Если это жизненно важно, я могу попытаться вытащить из него кучу вещей, чтобы дезинформировать его для Интернета. Я думаю, что в нем могут быть некоторые проприетарные вещи.
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");
}
}
}