long start = System.currentTimeMillis();
try(FileReader fileReader = new FileReader("sometxt.txt")) {
int i;
do {
i = fileReader.read();
} while (i != -1);
} catch (IOException e) {
e.printStackTrace();
}
System.out.println("Time: " + (System.currentTimeMillis() - start));
结果:
Time: 428
现在使用BufferedReader:
long start = System.currentTimeMillis();
try(BufferedReader bufferedReader = new BufferedReader(new FileReader("sometxt.txt"))) {
int i;
do {
i = bufferedReader.read();
} while (i != -1);
} catch (IOException e) {
e.printStackTrace();
}
System.out.println("Time: " + (System.currentTimeMillis() - start));
“常规”(即不包裹
BufferedReader)阅读器每次阅读字符都要参考来源(例如,文件),这是一项相对耗时的工作。例如,你有一个包含很多字符的文件,你想使用通常的FileReader.read()在这种情况下,您对读取一个字符的方法的每次调用都会生成一次文件访问,并且您将访问它的次数与其中的字符数一样多。但
BufferedReader它的工作方式是访问源,一次从那里读取很多字符(默认为 8192),将它们输入到某个数组中,然后在下一个方法调用期间或字符将从该数组中read()读取readLine(),这当然要快得多。所以如果你想逐个字符地读取文本文件,但是使用
BufferedReader,那么第一次调用该方法时,read()8192 个字符将立即被缓冲,下次调用该方法时,字符将简单地从缓冲区中取出.让我们测量阅读包含大约十万个字符的文本文档的时间,不使用它
BufferedReader和使用它。不使用
BufferedReader:结果:
现在使用
BufferedReader:结果:
如文档中所写:
也就是说,需要缓冲来避免从磁盘或网络读取字节/字符——在读取过程中,数据被加载到内存中的缓冲区中,并从那里读取,从而减少磁盘/网络访问次数。因此,这个类推荐用于包装
FileReader/ instancesInputStreamReader。