千家信息网

Java中BufferedReader与Scanner读入的区别是怎么样的

发表于:2025-11-16 作者:千家信息网编辑
千家信息网最后更新 2025年11月16日,今天就跟大家聊聊有关Java中BufferedReader与Scanner读入的区别是怎么样的,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。j
千家信息网最后更新 2025年11月16日Java中BufferedReader与Scanner读入的区别是怎么样的

今天就跟大家聊聊有关Java中BufferedReader与Scanner读入的区别是怎么样的,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。

java.util.Scanner类是一个简单的文本扫描类,它可以解析基本数据类型和字符串。它本质上是使用正则表达式去读取不同的数据类型。

Java.io.BufferedReader类为了能够高效的读取字符序列,从字符输入流和字符缓冲区读取文本。

在Java中,我们都知道Java的标准输入串是System.in。但是我们却很少在Java中看到谁使用它,这是因为我们平时输入的都是一个字符串或者是一个数字等等。而System.in提供的read方法是通过字节来读取数据的,所以对我们来说不方便处理!

Scanner

在Java SE6提供了一个非常方便的输入数据的类Scanner,位于java.util包中,这个Scanner的具体用法为Scanner in = new Scanner(System.in)。

通过new创建一个Scanner对象,Scanner需要传入一个System.in作为参数,这个我们可以看作是Scanner通过其内部机制将System.in包装起来而实现数据的读取工作的。

Scanner对象通过一系列的in.nextXxx();方法来读取相应的基本类型的数据,通过in.hasNextXxx();方法来判断是否还有下一个数据。

然而,Scanner读取数据是按空格符(这其中包括空格键,Tab键,Enter键)来分割数据的。

只要遇到其中之一,Scanner的方法就会返回下一个输入(当然nextLine()方法的结束符为换行符,它会返回换行符之前的数据),这也就是我们会面临的另一个问题,当我们的输入数据中有空格时,我们就不会得到我们想要的数据,这样我们就要考虑到BufferReader来读取数据!

BufferReader

BufferReader位于java.io包中,使用BufferReader就相对来说没有那么多方法来让你选择!读取数据比较固定,这样格式也就相对来说比较单一,只要记住就这一读取数据的方法。

BufferedReader br = new BufferedReader (newInputStreamReader(System.in));

这个BufferReader对象通过readLine();方法来读取数据,readLine()是按Enter回车来读取一行数据的,只要在回车键之前的都会被readLine()方法返回。

readLine()方法返回的是字符串,因此要使用BufferReader输入一些字符之外的类型的数据,就要相对比较麻烦,需要通过一些XXXX.parseXxx();来转换相应的数据类型,(例如:int类型的用Integer.parseInt(需要转换的字符串))。

虽然麻烦一些,但通过BufferReader读入的效率要比Scanner高一倍,这个差距可想而知,而且读取的数据越多,效果就越明显。

需要注意的是使用BufferedReader对象的readLine()方法必须处理java.io.IOException异常。

两者的对比

1、Scanner提供了一系列nextXxx()方法,当我们确定输入的数据类型时,使用Scanner更加方便。也正是因为这个BufferedReader相对于Scanner来说要快一点,因为Scanner对输入数据进行类解析,而BufferedReader只是简单地读取字符序列。

2、Scanner和BufferedReader都设置了缓冲区,Scanner有很少的缓冲区(1KB字符缓冲)相对于BufferedReader(8KB字节缓冲),但是这是绰绰有余的。

3、BufferedReader是支持同步的,而Scanner不支持。如果我们处理多线程程序,BufferedReader应当使用。

4、Scanner输入的一个问题:在Scanner类中如果我们在任何7个nextXXX()方法之后调用nextLine()方法,这nextLine()方法不能够从控制台读取任何内容,并且,这游标不会进入控制台,它将跳过这一步。nextXXX()方法包括nextInt(),nextFloat(), nextByte(),nextShort(),nextDouble(),nextLong(),next()。

在BufferReader类中就没有那种问题。这种问题仅仅出现在Scanner类中,由于nextXXX()方法忽略换行符,但是nextLine()并不忽略它。如果我们在nextXXX()方法和nextLine()方法之间使用超过一个以上的nextLine()方法,这个问题将不会出现了;因为nextLine()把换行符消耗了。

程序示例

package com.zxt.base; import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.util.Scanner; public classSystemInTest {     private static Scanner sc;     public static void main(String[] args) {        // 使用Scanner输入        sc = new Scanner(System.in);        int num1 = sc.nextInt();        int num2 = sc.nextInt();        System.out.println("num1 + num2 = "+ (num1+ num2));         // 使用BufferReader输入        InputStreamReaderisr = newInputStreamReader(System.in);        BufferedReaderbr = new BufferedReader(isr);        try {            int num3 = Integer.parseInt(br.readLine());            int num4 = Integer.parseInt(br.readLine());            System.out.println("num3 + num4 = "+ (num3+ num4));         }catch(NumberFormatException | IOException e) {            e.printStackTrace();        }                      // 使用Scanner输入会遇到的问题        System.out.println();        System.out.print("Enter an Integer:");        int intValue = sc.nextInt();        System.out.print("Enter a String:");        StringstrValue = sc.nextLine();        System.out.printf("You have entered intValue is " + intValue+ " and strValue is " + strValue);               // 问题原因:由于nextXXX()方法忽略换行符,但是nextLine()并不忽略它。所以如果我们在nextXXX()方法后面使用nextLine()将会出现问题        // 解决方案是:在使用nextXXX()方法后,在使用nextLine()读取下一行数据前,多使用一个nextLine()用来消耗换行符        // int intValue = sc.nextInt();        // sc.nextLine();        // String strValue = sc.nextLine();               // 或者使用BufferReader不会出现该问题        System.out.println();        try {            System.out.print("Enter an Integer:");            int intValue1 = Integer.parseInt(br.readLine());            System.out.print("Enter a String:");            StringstrValue1 = br.readLine();            System.out.printf("You have entered intValue1 is " + intValue1+ " and strValue1 is " + strValue1);                   }catch(NumberFormatException | IOException e) {            e.printStackTrace();        }    }}

看完上述内容,你们对Java中BufferedReader与Scanner读入的区别是怎么样的有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注行业资讯频道,感谢大家的支持。

数据 方法 输入 字符 问题 类型 换行符 缓冲 内容 字符串 对象 缓冲区 处理 支持 一行 字节 序列 控制台 文本 程序 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 怎么查看别的公司服务器 物业软件开发 租用服务器怎么安全 临河短期app软件开发培训 批量管理服务器的英文软件 数据库包括哪些技术 西门子网络安全挑战 脚本记录cpu和内存数据库 oc连接数据库 xbox能玩mc服务器吗 口口购车互联网科技有限公司 用户登录数据库表主要字段 apnetwork服务器代码ins 银行业务存款取款数据库关系图 软件开发企业 即征即退 软件开发内容完整性和编制水平 闪烁之光手游服务器都爆满了 四级网络技术考什么 serve服务器怎么关机 计算机网络技术硬环境 石林参考软件开发市场价 q币充值提示网络安全吗 软件开发需要哪些合作伙伴 数据库应用领域的调查对象 北京互联网科技研究院是什么 慧财网络技术有限公司官网 安卓软件开发大神 银行业务存款取款数据库关系图 央企中国网络安全联盟 数据库应用技术实训报告小结
0