BufferedReader和Scanner的区别

标题1:BufferedReader的用法

首先看看下面的代码

import java.io.*;
public class Main {
   public static void main(String[] args) throws IOException {
      //创建BufferedReader对象,从键盘读入
      BufferedReader b1=new BufferedReader(new InputStreamReader(System.in));
      //创建BufferedReader对象,从文本文件读入
      BufferedReader b2= new BufferedReader(new FileReader("test.txt"));
      //读取一行数据并用空格分隔,存入字符串数组
      String[] srt=b1.readLine().split(" ");
  }
}

BufferedReader类位于java.io包中,所以要使用这个类,就要引入java.io这个包:
import java.io.BufferedReader。readLine()方法会返回用户在按下Enter键之前的所有字符输入,不包括最后按下的Enter返回字符。使用BufferedReader对象的readLine()方法必须处理java.io.IOException异常(Exception)。BufferReader读取的数据都以字符串的形式存储,如果需要其他形式的数据,需要进行强制转换

使用BufferedReader读入数据,需要new一个InputStreamReader类的对象(源码显示:)
在这里插入图x片描述

标题2:Scanner的用法

  • 在命令行模式下要输入数据至程序中时,可以使用标准输入串对象System.in。但是,我们并不经常直接使用它,因为System.in提供的read()每次只能读取一个字节的数据,而我们平时所应用的通常是读取一个字符串或者是一个数字,所以read方法所以提供的功能,对我们来说并没有太大的用处。
  • 在Java SE 6中,可以使用Scanner类取得用户的输入。Scanner类位于java.util包中,如果你要使用Scanner取得用户输入的话,要加上import java.util.Scanner; 这条语句。import的功能是告诉编译器,我们将使用java.util包中的Scanne类。

Scanner的常用方法:

import java.util.Scanner;
public class Main {
    public static void main(String[] args){
        Scanner sc=new Scanner(System.in);//创建Scanner类对象,从键盘读入数据
        String t1=sc.nextLine();//读取下一行数据
        String t2=sc.next();//读取字符直到判断输入结束
        sc.useDelimiter(" ");//若以空格分隔字符串,需要读取空格才能继续读取或者使用一个空的sc.nextLine()跳过空格
        int t3=sc.nextInt();//将读取的字符串转换成int类型的整数
        double t4=sc.nextDouble();//将读取的字符串转换成float型;
        boolean t5=sc.nextBoolean();//将读取的字符串转换成boolean型;
    }
}
  • 需要注意的是Scanner中的next()和nextLine()方法的区别
    1、nextLine()方法返回的是Enter键之前的所有字符,它是可以得到带空格的字符串的。
    next()会自动消去有效字符前的空格,只返回输入的字符,不能得到带空格的字符串。
    2、nextLine()方法的结束符只是Enter键。
    next()在输入有效字符之后,将其后输入的空格键、Tab 键或Enter键等视为分隔符或结束符。

  • Scanner的hasNext()方法:
    【查看源码】:
    在这里插入图片描述
    【方法解释】:hasNext()方法的执行过程是这样的:当执行到hasNext()时,它会先扫描缓冲区中是否有字符,有则返回true,继续扫描。直到扫描为空,这时并不返回false,而是将方法阻塞,等待我们输入内容然后继续扫描。这样的话,它会一直处于循环等待中。
    【解决方法】:使用带有参数的重载方法,当扫描到的字符与参数值匹配时返回true。
    在这里插入图片描述

————————例如下面代码————————
【修改代码前】
在这里插入图片描述
【修改代码后】
在这里插入图片描述

标题3:两者的区别

  • 对于是否可以读入空格符有区别
    Scanner取得输入数据的依据是空格符,包括空格键,Tab键和Enter键,Scanner就会返回下一个输入。所以说**Scanner不能输入空格(除了它的nextLine方法可以读取空格符,再其他的方法都不能读取空格,but能不用就不用这个方法,在最后面做特殊解释)**如果希望取得含有空格的字符串;

    BufferedReader可以做到,它的readLine()方法会返回用户在按下Enter键之前的所有字符输入(包含空格),不包括最后按下的Enter。

  • 并且两者在效率方面也有很大的区别
    BufferedReader是从字符输入流中读取文本,缓冲各个字符,从而提供字符、数组和行的高效读取!(
    BufferedReader是提前先把数据读到缓存区,然后再写到硬盘里;Scanner是直接往硬盘写数据)速度要比Scanner快!而且也可以设置缓冲区的大小,或者可使用默认的大小。大多数情况下,默认值就足够大了。
    性能比较经过测试,Scanner的平均耗时是BufferedReader的10倍左右,在网上题刷,如果没有特殊困难,强烈推荐使用BufferedReader读取数据!

—————————————————————————————

这里特殊解释一下Scanner的nextLine()方法
【代码演示】
在这里插入图片描述
【运行结果】:
在这里插入图片描述

  • 一般程序中,使用nextLine()方法可能会出现吞回车现象,(观察上面两个图)
    ==>运行结果中,让输入第3个字符串,可是没等输入就已经运行结束了。

    这里是因为当输入完第2个字符串world后按回车键,又next()是读不到回车的,而是将回车作为分隔符,所以,留给了第3个字符串的nextLine()。

    第3个字符串由nextLine()输入,所以nextLine()方法就顺势直接读取了回车键退出程序了。
    (当成第3个字符串是空字符串了)

  • 解决此现象:这里为了能正常输入第三个字符串,需在 输入第3个字符串之前多加一句nextLine(),去读取第2个next()留下的回车

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章