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

我的问题是:

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


当前回答

Scanner用于解析来自流内容的令牌,而BufferedReader只读取流,不做任何特殊的解析。

事实上,您可以将BufferedReader传递给扫描器作为要解析的字符源。

其他回答

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.

下面的答案来自从控制台读取:JAVA Scanner vs BufferedReader

当从控制台读取输入时,有两个选项可以实现这一点。首先使用Scanner,另一个使用BufferedReader。两者都有不同的特点。这意味着如何使用它的差异。

扫描器将给定的输入作为标记处理。BufferedReader只是将输入作为字符串逐行读取。Scanner本身提供了解析功能,就像nextInt()、nextFloat()一样。

但是,别人又有什么区别呢?

扫描器将给定的输入作为标记处理。BufferedReader作为流行/字符串。 使用正则表达式对给定输入进行扫描器标记化。使用BufferedReader必须编写额外的代码。 BufferedReader比Scanner更快。2 扫描仪未同步,BufferedReader已同步

从JDK 1.5及更高版本开始就有了Scanner。

什么时候应该使用扫描器,还是缓冲阅读器?

看看它们之间的主要区别,一个使用标记化,另一个使用流线。当您需要解析功能时,请改用Scanner。但是,我更喜欢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();

Scanner用于解析来自流内容的令牌,而BufferedReader只读取流,不做任何特殊的解析。

事实上,您可以将BufferedReader传递给扫描器作为要解析的字符源。

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