Scanner和BufferReader之区别
在这几天刷算法题时,发现是ACM模式,每一道题都需要有输入,所以想要汇总一下晚上BufferedReader
和Scanner
的区别,以便更深的理解这两个类的区别。
一、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 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· Obsidian + DeepSeek:免费 AI 助力你的知识管理,让你的笔记飞起来!
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了