📜  为什么 bufferedreader 比扫描器快 - Java (1)

📅  最后修改于: 2023-12-03 15:06:16.269000             🧑  作者: Mango

为什么 BufferedReader 比 Scanner 快?

在Java中,BufferedReader和Scanner都是常见的读取文件或者读取用户输入的方法,但是对于大数据量的读取,BufferedReader的速度要比Scanner快很多,那么为什么BufferedReader比Scanner快呢?

理解BufferedReader和Scanner的基本原理

首先,我们需要了解BufferedReader和Scanner的基本原理。BufferedReader是一种输入流读取器,通过将在底层的输入流中读取数据并缓冲字符,减少了对文件或socket资源的访问量,较少很多的读写时间,提高了读取速度。Scanner是基于正则表达式切分字符,将字符按照分隔符进行切分,再进行数据转换。

缓冲区域大小的影响

BufferedReader中一次读取的缓冲区域大小是8KB。而Scanner的缺省值只有1024个字符。因此如果使用BufferedReader,缓冲区域较大,读取效率较高,而Scanner的效率则较低。如果要提高Scanner的效率,可以通过设置缓冲区域来提高,如Scanner scan = new Scanner(new BufferedInputStream(new FileInputStream("filename")), "UTF-8");

读取文件的方式不同

在读取文件方面,Scanner每次只能读取一个单词或者一行字符串,而BufferedReader可以读取任何数量的字符,只要没有超过缓冲区域的大小。因此,如果需要读取大量的数据,使用BufferedReader更为高效。

数据类型的转换

在Scanner中,每调用一次next()方法,都会读取字符串,再根据需要进行类型转换,例如nextLong()、nextDouble()等。每次进行类型转换,都会降低读取速度。而BufferedReader则可以通过readLine()方法直接读取整个字符串,不需要进行类型转换。

综上,BufferedReader比Scanner快的原因主要是缓冲区域较大,可以一次读取更多的数据,不需要进行类型转换,同时对二进制数据的支持也更加完善。

所以,在需要高效读取大量数据的情况下,我们推荐使用BufferedReader。而在需要读取少量数据、且希望使用正则表达式进行分割、并需要支持多种数据类型的情况下,使用Scanner更方便。