2021-04-22 16:47阅读: 238评论: 1推荐: 0

Scanner和BufferReader之区别

在这几天刷算法题时,发现是ACM模式,每一道题都需要有输入,所以想要汇总一下晚上BufferedReaderScanner的区别,以便更深的理解这两个类的区别。

一、Scanner

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

在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();方法来判断是否还有下一个数据。

import java.util.Scanner;
public class Main {
    public static void main(String[] args){
    	Scanner sc=new Scanner(System.in);//创建Scanner类对象,从键盘读入数据
    	String temp1=sc.nextLine();//读取下一行数据
    	String temp2=sc.next();//读取字符直到判断输入结束
    	sc.useDelimiter(" ");//若以空格分隔字符串,需要读取空格才能继续读取或者使用一个空的sc.nextLine()跳过空格
    	int temp3=sc.nextInt();//将读取的字符串转换成int类型的整数
    	double temp4=sc.nextDouble();//将读取的字符串转换成float型;
    	boolean temp5=sc.nextBoolean();//将读取的字符串转换成boolean型; 
    }
}

例如
输入第一行仅包含三个正整数n,x,y
输入第二行包含n个整数,中间用空格隔开

import java.util.Scanner;
public class Main{
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int x = sc.nextInt();
        int y = sc.nextInt();
        int[] score = new int[n];
        for(int i = 0; i < n; i++) {
            score[i] = sc.nextInt();
        }
    }
}

然而,Scanner读取数据是按空格符,这其中包括空格键,Tab键,Enter键。只要遇到其中之一,Scanner的方法就会返回下一个输入 ,这也就是我们会面临的另一个问题,当我们的输入数据中有空格时,我们就不会得到我们想要的数据,这样我们就要考虑到BufferReader来读取数据啦!

二、BufferedReader

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

BufferReader br = new BufferReader(new InputStreamReader(System.in))

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

然而,要使用BufferedReader输入一些字符之外的类型的数据,就要相对比较麻烦,需要通过一些XXXX.parseXxx();来转换相应的数据类型,虽然,麻烦一些,但通过在一些OJ系统上的和Scanner作对比,BufferReader的效率要比Scanner高一倍,这个差距可想而知,读取的数据越多,效果就越明显。

import java.io.*;
import java.util.Scanner;
public class Main {
    public static void main(String[] args) throws IOException {
    	Scanner sc=new Scanner(System.in);//创建Scanner类对象,从键盘读入数据
    	String temp1=sc.nextLine();//读取下一行数据
    	String temp2=sc.next();//读取字符直到判断输入结束
    	sc.useDelimiter(" ");//若以空格分隔字符串,需要读取空格才能继续读取或者使用一个空的sc.nextLine()跳过空格
    	int temp3=sc.nextInt();//将读取的字符串转换成int类型的整数
    	double temp4=sc.nextDouble();//将读取的字符串转换成float型;
    	boolean temp5=sc.nextBoolean();//将读取的字符串转换成boolean型; 
    }
}

例如

输入第一行仅包含三个正整数n,x,y
输入第二行包含n个整数,中间用空格隔开

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
 
public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        //输入的字符串是按空格隔开的,
        //trim()函数是去掉String字符串的首尾空格
        //split()函数是根据参数如",", "-", " "等, 分割String字符串, 返回一个String的数组(String[])
        String[] s = br.readLine().trim().split(" ");
        
        int n = Integer.parseInt(s[0]);
        int x=Integer.parseInt(s[1]);
        int y=Integer.parseInt(s[2]);

        //将第二行的字符串拆开添加到arr中
        int[] arr = new int[n];
        s=br.readLine().trim().split(" ");
        for(int i=0; i <arr.length;++i){
            arr[i]=Integer.parseInt(s[i]);
        }
    }
}

本文作者:今天学了吗

本文链接:https://www.cnblogs.com/hugoyu/p/14613900.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   今天学了吗  阅读(238)  评论(1编辑  收藏  举报
编辑推荐:
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· Obsidian + DeepSeek:免费 AI 助力你的知识管理,让你的笔记飞起来!
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起