我明白使用BufferedReader(封装FileReader)会比使用BufferedInputStream(封装FileInputStream)慢得多,因为原始字节必须转换为字符。但我不明白为什么差别如此之大!这是我正在使用的两个代码示例:
BufferedInputStream inputStream = new BufferedInputStream(new FileInputStream(filename));
try {
byte[] byteBuffer = new byte[bufferSize];
int numberOfBytes;
do {
numberOfBytes = inputStream.read(byteBuffer, 0, bufferSize);
} while (numberOfBytes >= 0);
}
finally {
inputStream.close();
}
和:
BufferedReader reader = new BufferedReader(new FileReader(filename), bufferSize);
try {
char[] charBuffer = new char[bufferSize];
int numberOfChars;
do {
numberOfChars = reader.read(charBuffer, 0, bufferSize);
} while (numberOfChars >= 0);
}
finally {
reader.close();
}
我尝试了使用不同缓冲区大小的测试,所有测试都是以一个150兆字节的文件为基础。以下是测试结果(缓冲区大小以字节表示;时间以毫秒表示):
Buffer Input
Size Stream Reader
4,096 145 497
8,192 125 465
16,384 95 515
32,768 74 506
65,536 64 531
可以看出,BufferedInputStream的最快时间(64毫秒)比BufferedReader的最快时间(465毫秒)快七倍。如我上面所述,我对显着差异并没有意见;但是这么大的差异似乎有些不合理。
我的问题是:是否有人有建议如何提高BufferedReader的性能,或者有其他替代机制?