Java中Scanner和BufferReader类之间的区别

java.util.Scannerclass是一个简单的文本扫描程序, 可以解析原始类型和字符串。它在内部使用正则表达式读取不同的类型。
Java.io.BufferedReader类从字符输入流中读取文本, 缓冲字符, 以便有效读取字符序列
以下是上述两者之间的区别。
【Java中Scanner和BufferReader类之间的区别】在nextXXX()之后使用nextLine()时, 扫描仪出现问题
尝试猜测以下代码的输出:

//Code using Scanner Class import java.util.Scanner; class Differ { public static void main(String args[]) { Scanner scn = new Scanner(System.in); System.out.println( "Enter an integer" ); int a = scn.nextInt(); System.out.println( "Enter a String" ); String b = scn.nextLine(); System.out.printf( "You have entered:- " + a + " " + "and name as " + b); } }

输入如下:
50 Geek

输出如下:
Enter an integer Enter a String You have entered:- 50 and name as

让我们使用Buffer类和相同的Input尝试相同的操作
//Code using Buffer Class import java.io.*; class Differ { public static void main(String args[]) throws IOException { BufferedReader br = new BufferedReader( new InputStreamReader(System.in)); System.out.println( "Enter an integer" ); int a = Integer.parseInt(br.readLine()); System.out.println( "Enter a String" ); String b = br.readLine(); System.out.printf( "You have entered:- " + a + " and name as " + b); } }

输入如下:
50 Geek

输出如下:
Enter an integer Enter a String you have entered:- 50 and name as Geek

在Scanner类中, 如果我们在七个nextXXX()方法中的任何一个之后调用nextLine()方法, 则nextLine()不会从控制台读取值, 并且光标不会进入控制台, 它将跳过该步骤。 nextXXX()方法是nextInt(), nextFloat(), nextByte(), nextShort(), nextDouble(), nextLong(), next()。
在BufferReader类中, 没有这种类型的问题。由于nextXXX()方法忽略换行符, 并且nextLine()仅读取直到第一个换行符, 因此仅对于Scanner类会出现此问题。如果我们在nextXXX()和nextLine()之间再使用一次nextLine()方法的调用, 则不会发生此问题, 因为nextLine()将消耗换行符。
也可以通过使用next()代替nextLine()来获取字符串输入来解决此问题, 如图所示
  • BufferedReader是同步的, 而Scanner不同步。如果我们使用多个线程, 则应使用BufferedReader。
  • BufferedReader的缓冲区内存比Scanner大得多。
  • 与BufferedReader(8KB字节缓冲区)相比, 扫描仪有一个小缓冲区(1KB字符缓冲区), 但绰绰有余。
  • 与扫描仪相比, BufferedReader要快一些, 因为扫描仪会解析输入数据, 而BufferedReader只是读取字符序列。
如果发现任何不正确的地方, 或者想分享有关上述主题的更多信息, 请发表评论。

    推荐阅读