Если вы можете, установите фильтр в писатель. Это позволяет вам записывать потоковый символ на символ и заменять специальные символы при их обнаружении (избавляя вас от необходимости выделять второй строковый объект).
Попробуйте вывести как можно больше символов строки одновременно, потому что вызов write () в цикле для каждого отдельного символа стоит дорого. Вместо этого используйте этот псевдокод:
int start = 0;
for (int i=0; i<str.length(); i++) {
char c = str.getChar(i);
String emit = null;
switch (c) {
case '<': emit = "<"; break;
case '>': emit = ">"; break;
case '\'': emit = "'"; break;
case '"': emit = """; break;
}
if (emit != null) {
write(str,start,i);
start = i;
write(emit);
}
}
if (start != str.length()) {
write(str);
}
В общем случае цикл будет проходить строку один раз (что быстро) и вызывать write () один раз.
Если вы не можете установить фильтр в модуле записи, вы можете использовать тот же код для фильтрации строки. В общем случае вы просто вернете входную строку. В if (emit != null)
вы можете выделить новую копию. Но так как это произойдет только в том случае, если в строке есть специальные символы, это намного дешевле, чем создание копии для каждой строки.