• 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]);
            }
        }
    }
    
  • 相关阅读:
    防止表单重复提交
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
  • 原文地址:https://www.cnblogs.com/hugoyu/p/14613900.html
Copyright © 2020-2023  润新知