据我所知,在Java中从文件中读取基于字符的数据的两种最常见的方法是使用Scanner或BufferedReader。我还知道BufferedReader通过使用缓冲区来避免物理磁盘操作,从而有效地读取文件。
我的问题是:
扫描器的性能和BufferedReader一样好吗? 为什么你会选择扫描器而不是BufferedReader,反之亦然?
据我所知,在Java中从文件中读取基于字符的数据的两种最常见的方法是使用Scanner或BufferedReader。我还知道BufferedReader通过使用缓冲区来避免物理磁盘操作,从而有效地读取文件。
我的问题是:
扫描器的性能和BufferedReader一样好吗? 为什么你会选择扫描器而不是BufferedReader,反之亦然?
当前回答
BufferedReader可能会给你更好的性能(因为Scanner是基于InputStreamReader,查看源代码)。哎呀,对于从文件中读取数据,它使用nio。当我测试nio的性能与大文件的BufferedReader性能时,nio显示出更好的性能。 要从文件中读取数据,请尝试Apache Commons IO。
其他回答
Scanner用于解析来自流内容的令牌,而BufferedReader只读取流,不做任何特殊的解析。
事实上,您可以将BufferedReader传递给扫描器作为要解析的字符源。
在当前最新的JDK 18发布/构建(b37)中,与BufferedReader(8192个字符)相比,Scanner的缓冲区更小(1024个字符),但这已经足够了。
至于选择,如果你想解析文件,使用Scanner,如果你想逐行读取文件,使用BufferedReader。也请参阅前面链接的API文档的介绍文本。
解析=将给定的输入解释为标记(部分)。它可以直接返回特定的部分,如int,字符串,小数等。请参见Scanner类中的所有nextXxx()方法。 阅读=无声流媒体。它不断返回给你所有的字符,你反过来必须手动检查,如果你想匹配或组合一些有用的东西。但如果你不需要这样做,那么阅读就足够了。
我更喜欢Scanner,因为它不会抛出检查异常,因此它的使用结果在一个更精简的代码。
BufferedReader可能会给你更好的性能(因为Scanner是基于InputStreamReader,查看源代码)。哎呀,对于从文件中读取数据,它使用nio。当我测试nio的性能与大文件的BufferedReader性能时,nio显示出更好的性能。 要从文件中读取数据,请尝试Apache Commons IO。
BufferedReader has significantly larger buffer memory than Scanner. Use BufferedReader if you want to get long strings from a stream, and use Scanner if you want to parse specific type of token from a stream. Scanner can use tokenize using custom delimiter and parse the stream into primitive types of data, while BufferedReader can only read and store String. BufferedReader is synchronous while Scanner is not. Use BufferedReader if you're working with multiple threads. Scanner hides IOException while BufferedReader throws it immediately.