Java 需要更快地转换文件

Java 需要更快地转换文件,java,text,Java,Text,我有一个文本文件包含的数据,其中包含一些特殊字符,如'SOH'或'STX'和ASCII值13和10。我需要删除这些字符并将其替换为“\n” 现在我一次提取每个字符并替换相应的字符。问题是我的文件大小以GB为单位,它一次读取每个字符并执行操作 这个过程需要很多时间才能完成。如果我试图将字符读取量增加1以上,则会导致文件数据结构不好 我需要在这方面的帮助,使这个过程更快或一些其他技术来转换这些文件 char[] chars = new char[1]; for(int len; (len = rea

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

replaceAll使用正则表达式,每次运行时占用O(n)的时间和空间(它构建字符串的一个副本)

因此,
s.replaceAll(a,b).replaceAll(c,d).replaceAll(e,f)
所需时间(时间和空间)比单次扫描长3倍。您确实只需要扫描字符串一次

此外,您正在一次读/写chars 1。缓冲读取要快得多

假设使用纯ASCII,速度会快得多(它不需要查找表之外的额外空间,也不需要正则表达式匹配):

boolean[]坏=新布尔[256];
错误[13]=错误[10]=错误[2]=正确;//在此处添加更多“坏”值;假设<256
BufferedReader br=新的BufferedReader(读卡器);
BufferedWriter bw=新的BufferedWriter(writer);
char[]block=新字符[1024*4];//一次读取4k
for(int len;(len=br.read(block,0,block.length())>0;){

对于(int i=0;iYou应改为使用并一次读取多个字符,例如带有字符[512]的缓冲区)同时也要写它们——一个字节一个字节的啄食要比一次大量的啄食慢得多。在一个空闲的旋转磁盘中,你需要旋转磁盘,将位置放在读/写磁头下,然后读取字节。不,我可以再次扫描字符串。唯一的问题是文件大小非常大。你可以扫描4711次,但是这不是tucuxi提出的要点。如果你扫描一个字符串两次,你实际上是在将你正在处理的文件的大小增加一倍。添加的代码:4k的读写缓冲区(相当于一个数量级的性能更好)加上快速查找“坏”字符。
 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);
 }