📜  Java中Scanner和BufferReader类之间的区别

📅  最后修改于: 2020-03-24 13:09:54             🧑  作者: Mango

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

// Java使用Scanner类
import java.util.Scanner;
class Differ
{
     public static void main(String args[])
     {
         Scanner scn = new Scanner(System.in);
         System.out.println("输入一个整数");
         int a = scn.nextInt();
         System.out.println("输入一个String");
         String b = scn.nextLine();
         System.out.printf("您输入了:- "
                 + a + " " + "and name as " + b);
     }
}

输入:

50
芒果

输出:

输入一个integer
输入一个String
您输入了:- 50 and name as

让我们使用Buffer类和相同的Input尝试相同的操作

// Java展示使用Buffer类
import java.io.*;
class Differ
{
    public static void main(String args[])
                  throws IOException
    {
        BufferedReader br = new BufferedReader(new
        InputStreamReader(System.in));
        System.out.println("输入一个整数");
        int a = Integer.parseInt(br.readLine());
        System.out.println("输入一个String");
        String b = br.readLine();
        System.out.printf("您输入了:- " + a +
                          " and name as " + b);
    }
}

输入:

50
芒果

输出:

输入一个整数
输入一个String
您输入了:- 50 and name as 芒果

nextXXX()方法有:nextInt(),nextFloat(),nextByte(),nextShort(),nextDouble(),nextLong(),next()。在Scanner类中,如果我们在七个nextXXX()方法中的任何一个之后调用nextLine()方法,则nextLine()不会从控制台读取值,并且光标不会进入控制台,它将跳过该步骤。

在BufferReader类中,没有这种类型的问题。由于nextXXX()方法忽略换行符,并且nextLine()仅读取直到第一个换行符,因此仅对于Scanner类会出现此问题。如果我们在nextXXX()和nextLine()之间再使用一次nextLine()方法的调用,则不会发生此问题,因为nextLine()将消耗换行符。此问题与C/C++中的scanf()和后跟gets()的问题相同。

其他差异:

  • BufferedReader是同步的,而Scanner不是。如果我们使用多个线程,则应使用BufferedReader。
  • BufferedReader的缓冲区内存比Scanner大得多。
  • 与BufferedReader(8KB字节缓冲区)相比,Scanner有一个小缓冲区(1KB字符缓冲区),但绰绰有余。
  • 与Scanner相比,BufferedReader要快一些,因为Scanner会解析输入数据,而BufferedReader只是读取字符序列。