需要更快地转换文件

时间:2014-07-16 08:59:57

标签: java text

我有一个文本文件,其中包含一些特殊字符,例如' 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"));
}

1 个答案:

答案 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);
 }