当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


Java Scanner和BufferedReader的区别用法及代码示例


在 Java 中,Scanner 和 BufferedReader 类是用作读取输入的方式的源。 Scanner class 是一个简单的文本扫描器,可以解析原始类型和字符串。它内部使用正则表达式来读取不同类型,而另一方面 BufferedReader class 从 character-input 流中读取文本,缓冲字符以便高效读取字符序列

奇怪的差异在于通过 next() 方法读取不同的输入方式,该方法在下面的程序中通过类似的输入集得到了证明。

示例 1:

Java


// Java Program to Illustrate Scanner Class
// Importing Scanner class from
// java.util package
import java.util.Scanner;
// Main class
class GFG {
    // Main driver method
    public static void main(String args[])
    {
        // Creating object of Scanner class to
        // read input from keyboard
        Scanner scn = new Scanner(System.in);
        System.out.println("Enter an integer & a String");
        // Using nextInt() to parse integer values
        int a = scn.nextInt();
        // Using nextLine() to parse string values
        String b = scn.nextLine();
        // Display name and age entered above
        System.out.printf("You have entered:- " + a + " "
                          + "and name as " + b);
    }
}

输出:

Enter an integer & a String
10 John
You have entered:- 10 and name as  John

让我们尝试使用 Buffer 类和下面相同的输入进行相同的操作,如下所示:

示例 2:

Java


// Java Program to Illustrate BufferedReader Class
// Importing required class
import java.io.*;
// Main class
class GFG {
    // Main driver method
    public static void main(String args[])
        throws IOException
    {
        // Creating object of class inside main() method
        BufferedReader br = new BufferedReader(
            new InputStreamReader(System.in));
        System.out.println("Enter an integer");
        // Taking integer input
        int a = Integer.parseInt(br.readLine());
        System.out.println("Enter a String");
        String b = br.readLine();
        // Printing input entities above
        System.out.printf("You have entered:- " + a
                          + " and name as " + b);
    }
}

输出:

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

在BufferReader课程中不存在此类问题。此问题仅发生在 Scanner 类中,因为 nextXXX() 方法忽略换行符,而 nextLine() 只读取第一个换行符。如果我们在nextXXX()和nextLine()之间再调用一次nextLine()方法,那么就不会出现这个问题,因为nextLine()会消耗换行符。

Tip: See this for the corrected program. This problem is same as scanf() followed by gets() in C/C++. This problem can also be solved by using next() instead of nextLine() for taking input of strings as shown 这里.

以下是 Java 中 Scanner 和 BufferedReader 类之间的主要区别

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


相关用法


注:本文由纯净天空筛选整理自佚名大神的英文原创作品 Difference Between Scanner and BufferedReader Class in Java。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。