我有一个文本文件,其中包含一些特殊字符,例如' SOH'或者' STX'和ASCII值13和10.我需要删除这些字符并将其替换为' \ n'。
现在我一次拿走每个角色并替换相应的角色。问题是我的文件大小是GB,它一次读取每个字符并执行操作。
此过程需要很长时间才能完成。如果我尝试将字符读数增加1以上,则会给出错误的文件数据结构。
我需要一个帮助,以使这个过程更快或其他一些技术来转换这些文件。
char[] chars = new char[1];
for(int len; (len = reader.read(chars)) > 0;) {
String head = new String(chars);
fw.write(head.replaceAll(String.valueOf((char)13),"").replaceAll(String.valueOf((char)10), "").replaceAll(String.valueOf((char)2), "\n"));
}
答案 0 :(得分:2)
replaceAll正在使用正则表达式,每次运行时都会占用O(n)时间和空间(它会构建字符串的副本)。
因此,与单次扫描相比,s.replaceAll(a, b).replaceAll(c, d).replaceAll(e, f)
将花费3倍(时间和空间)。你真的只需要扫描一次字符串。
此外,您正在一次读/写字符1。缓冲读取要快得多。
假设纯ASCII,这将是 lot 更快(它不需要查询表之外的额外空间,并且它不需要正则表达式匹配):
boolean[] bad = new boolean[256];
bad[13] = bad[10] = bad[2] = true; // add more 'bad' values here; assuming < 256
BufferedReader br = new BufferedReader(reader);
BufferedWriter bw = new BufferedWriter(writer);
char[] block = new char[1024*4]; // read in 4k at a time
for (int len; (len = br.read(block, 0, block.length())) > 0;) {
for (int i=0; i<len; i++) {
if (block[i] < 256 && bad[(int)block[i]]) block[i] = '\n';
}
bw.write(block, 0, len);
}