我正在开发一个包含大约 400 个输入文件和大约 40 个输出文件的程序。 很简单:它读取每个输入文件并生成一个新文件,但更大(基于算法)。
我正在使用 BufferedReader 的 read() 方法:
String encoding ="ISO-8859-1";
FileInputStream fis = new FileInputStream(nextFile);
BufferedReader reader = new BufferedReader(new InputStreamReader(fis, encoding));
char[] buffer = new char[8192] ;
要读取我正在使用的输入文件:
private String getNextBlock() throws IOException{
boolean isNewFile = false;
int n = reader.read(buffer, 0, buffer.length);
if(n == -1) {
return null;
} else {
return new String(buffer,0,n);
}
}
我对每个 block 进行一些检查(比如查看 block 内的一些字符串),然后将其写入文件:
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(
new FileOutputStream("fileName"), encoding));
writer.write(textToWrite);
问题是大约需要 12 分钟。 我正在尝试更快地找到其他东西。 有人知道更好的东西吗?
谢谢。
最佳答案
你应该可以在这里找到答案:
http://nadeausoftware.com/articles/2008/02/java_tip_how_read_files_quickly
为了获得最佳的 Java 读取性能,需要记住四件事:
通过一次读取一个数组而不是一次读取一个字节来最大程度地减少 I/O 操作。一个 8Kbyte 的数组是一个很好的大小。
通过一次获取一个数组而不是一个字节来最大限度地减少方法调用。使用数组索引获取数组中的字节。
如果您不需要线程安全,请尽量减少线程同步锁。减少对线程安全类的方法调用,或者使用 FileChannel 和 MappedByteBuffer 等非线程安全类。
尽量减少 JVM/OS、内部缓冲区和应用程序阵列之间的数据复制。使用具有内存映射的 FileChannel,或直接或包装数组 ByteBuffer。
关于java - 更快的读取文件的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5854859/