据我所知,在Java中从文件中读取基于字符的数据的两种最常见的方法是使用Scanner或BufferedReader。我还知道BufferedReader通过使用缓冲区来避免物理磁盘操作,从而有效地读取文件。

我的问题是:

扫描器的性能和BufferedReader一样好吗? 为什么你会选择扫描器而不是BufferedReader,反之亦然?


当前回答

我更喜欢Scanner,因为它不会抛出检查异常,因此它的使用结果在一个更精简的代码。

其他回答

BufferedReader和Scanner的区别如下:

BufferedReader已同步,但Scanner未同步。 BufferedReader是线程安全的,但Scanner不是。 BufferedReader有更大的缓冲内存,而Scanner有更小的缓冲内存。 BufferedReader执行速度更快,但Scanner执行速度较慢。 从控制台读取一行的代码:

BufferedReader:

InputStreamReader isr = new InputStreamReader(System.in);
BufferedReader br = new BufferedReader(isr);
String st = br.readLine();
       
// You can make the object InputStreamReader object inside the BufferReader method.
BufferReader br = new BufferedReader(InputStreamReader(System.in));
String st = br.readLine();

// You can even inspect the type of the input stream manually by using Parse method which accepts string parameter.
int x = Integer.parseInt(br.readLine());

// Or you can pass the object directly.
int x = Integer.parseInt(st);

扫描仪:

Scanner sc = new Scanner(System.in);
String st = sc.nextLine();

我建议使用BufferedReader来读取文本。扫描器隐藏IOException而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。