Java中Scanner类与BufferReader类的不同点(非常详细)

 更新时间:2016年08月17日 11:20:46   作者:crane-yuan  
这篇文章主要介绍了Java中Scanner类与BufferReader类的不同点(非常详细)的相关资料,需要的朋友可以参考下

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

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

下面是两个类的不同之处:

当nextLine()被用在nextXXX()之后,用Scanner类有什么问题

尝试去猜测下面代码的输出内容;

// 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);
}
}

Input:

50
Geek

Output:

Enter an integer
Enter a String
You have entered:- 50 and name as

让我们尝试使用BufferReader类,并且使用相同的输入

// Code using BufferedReader 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);
}
}

Input:

50
Geek

Output:

Enter an integer
Enter a String
you have entered:- 50 and name as Geek

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

在BufferReader类中就没有那种问题。这种问题仅仅出现在Scanner类中,由于nextXXX()方法忽略***换行符***,但是,nextLine()并不忽略它。如果我们在nextXXX()方法和nextLine()方法之间使用超过一个以上的nextLine()方法,这个问题将不会出现了;因为nextLine()把换行符消耗了。可以参考这个程序的正确写法(http://code.geeksforgeeks.org/CErAhD)。这个问题和C/C++(http://www.geeksforgeeks.org/problem-with-scanf-when-there-is-fgetsgetsscanf-after-it/)中的scanf()方法紧跟gets()方法的问题一样。

其他的不同点:

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

•BufferedReader相对于Scanner有足够大的缓冲区内存。

•Scanner有很少的缓冲区(1KB字符缓冲)相对于BufferedReader(8KB字节缓冲),但是这是绰绰有余的。

•BufferedReader相对于Scanner来说要快一点,因为Scanner对输入数据进行类解析,而BufferedReader只是简单地读取字符序列。

以上所述是小编给大家介绍的Java中Scanner类与BufferReader类的不同点(非常详细),希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!

相关文章

  • Java并发编程回环屏障CyclicBarrier

    Java并发编程回环屏障CyclicBarrier

    这篇文章主要介绍了Java并发编程回环屏障CyclicBarrier,文章继续上文所介绍的Java并发编程同步器CountDownLatch展开主题相关内容,需要的小伙伴可以参考一下
    2022-04-04
  • 简介Java的Spring框架的体系结构以及安装配置

    简介Java的Spring框架的体系结构以及安装配置

    这篇文章主要介绍了Java的Spring框架的体系结构以及安装配置,Spring框架是Java的SSH三大web开发框架之一,需要的朋友可以参考下
    2015-12-12
  • JAVA基础之控制台输入输出的实例代码

    JAVA基础之控制台输入输出的实例代码

    下面小编就为大家带来一篇JAVA基础之控制台输入输出的实例代码。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-07-07
  • Spring中WebClient的创建和使用详解

    Spring中WebClient的创建和使用详解

    这篇文章主要介绍了Spring中WebClient的创建和使用详解,在Spring5中,出现了Reactive响应式编程思想,并且为网络编程提供相关响应式编程的支持,如提供了WebFlux,它是Spring提供的异步非阻塞的响应式的网络框架,需要的朋友可以参考下
    2023-11-11
  • Spring思维导图助你轻松学习Spring

    Spring思维导图助你轻松学习Spring

    这篇文章主要为大家详细介绍了Spring思维导图,帮助你轻松学习Spring的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-03-03
  • Java中的transient关键字解析

    Java中的transient关键字解析

    这篇文章主要介绍了Java中的 transient关键字解析,有时候我们的一些敏感信息比如密码并不想序列化传输给对方,这个时候transient关键字就派上用场了,如果一个类的变量加上了transient关键字那么这个字段就不会被序列化,需要的朋友可以参考下
    2023-09-09
  • Mybatis学习笔记之动态SQL揭秘

    Mybatis学习笔记之动态SQL揭秘

    这篇文章主要给大家介绍了关于Mybatis学习笔记之动态SQL的相关资料,小编觉得挺不错的,对大家学习或者使用Mybatis会有一定的帮助,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-11-11
  • 使用StringRedisTemplate操作Redis方法详解

    使用StringRedisTemplate操作Redis方法详解

    这篇文章主要为大家介绍了使用StringRedisTemplate操作Redis方法详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-08-08
  • java实现简单验证码生成

    java实现简单验证码生成

    这篇文章主要介绍了java实现简单验证码生成,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-10-10
  • EL调用Java方法_动力节点Java学院整理

    EL调用Java方法_动力节点Java学院整理

    简单来说,我们在一个类中的某个方法,可以使用EL进行调用,这个能被EL表达式调用的方法称之为EL函数,但是这种方式必须满足两点要求,具体哪两点,大家可以参考下本文
    2017-07-07

最新评论