Scanner, BufferedReader, InputStreamReader 与ACM模式输入html { -webkit-print-color-adjust: exact }
* { box-sizing: border-box; -webkit-print-color-adjust: exact }
{ }
{ }
{ }
{ }
{ }
{ }
{ }
{ }
{ }
{ }
{ }
{ }
{ }
{ }
{ }
{ }
{ }
{ }
{ }
{ }
{ }
{ }
{ }
{ }
{ }
{ }
{ }
{ }
{ }
{ }
{ }
{ }
{ }
{ }
{ }
ul:first-child { }
li { }
{ }
li { }
{ }
li { }
{ }
li { }
{ }
li { }
{ }
li { }
{ }
details { }
summary { }
{ }
{ }
{ }
{ }
{ }
{ }
{ }
{ }
{ }
{ }
{ }
{ }
{ }
.user { }
time { }
{ }
{ }
{ }
{ }
{ }
{ }
code { }
{ }
{ }
{ }
{ }
{ }
{ }
{ }
{ }
{ }
{ }
{ }
{ font-family: iawriter-mono, Nitti, Menlo, Courier, monospace }
{ }
{ }
{ }
{ font-family: PT Mono, iawriter-mono, Nitti, Menlo, Courier, monospace, "Twemoji", "Noto Color Emoji", "Noto Sans Mono CJK SC", "Noto Sans Mono CJK KR" }
{ }
{ }
{ }
{ }
{ }
{ }
{ }
{ }
{ }
{ }
{ }
{ }
{ }
{ }
{ }
{ }
{ }
{ }
{ }
{ }
{ }
{ }
{ }
{ }
{ }
{ }
{ }
{ }
{ }
{ }
{ }
{ }
{ }
{ }
{ }
{ }
{ }
{ }
{ background-color: rgba(206, 205, 202, 0.5) }
{ background-color: rgba(155, 154, 151, 0.4) }
{ background-color: rgba(140, 46, 0, 0.2) }
{ background-color: rgba(245, 93, 0, 0.2) }
{ background-color: rgba(233, 168, 0, 0.2) }
{ background-color: rgba(0, 135, 107, 0.2) }
{ background-color: rgba(0, 120, 223, 0.2) }
{ background-color: rgba(103, 36, 222, 0.2) }
{ background-color: rgba(221, 0, 129, 0.2) }
{ background-color: rgba(255, 0, 26, 0.2) }
{ }
{ }
{ }
Scanner, BufferedReader, InputStreamReader 与ACM模式输入
1. Scanner,BufferedReader,InputStreamReader 简介与对比
java.util.Scanner 类实现了Iterator<String> 和 Closeable接口;可以通过传入 System.in 从控制台读取输入,也可以通过传入一个File 对象从文件中读取输入,还可以通过传入字符串对象进行读取;
Scanner 类可以读取并转换基本类型的值和字符串;Scanner 使用分隔符 (delimiter pattern) 将其输入进行分割成标记 (token),默认的分隔符为空格;可以通过调用 useDelimiter() 方法并传入一个正则表达式字符串来修改分隔符;
java.io.BufferedReader 类继承自 Reader 类;读取character-input stream;
java.io.InputStreamReader 类继承自 Reader类;InputStreamReader类读取字节 (byte) 并将其解码成字符 (character) ;即:将字节流转换为字符流;
解码所使用的字符集可以在实例化对象时通过字符串形式或者 Charset对象传入,如果不传入则默认使用系统默认的字符集;
建议将InputStreamReader对象包装成BufferedReader对象再使用;
Scanner类和BufferedReader类的区别
Scanner 类和BufferedReader 类的区别便是:Scanner类是读取并转换输入流的,而BufferedReader类是直接读取输入流,并不做转换;由此BufferedReader类读取的速度要比Scanner类读取的速度快;由于BufferedReader类读取输入流不进行转换,Scanner类也可以通过一个BufferedReader对象来实例化;
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
Scanner fromBufferedScanner = new Scanner(br);
Scanner类的默认缓存大小为 1024,BufferedReader类的默认缓存大小为 8192;
使用场景建议
如果需要转换输入的内容那么使用Scanner类;
如果需要一行一行地读取那么使用BufferedReader类;
2. 详解Scanner 类
Scanner 类的输入入方法工作流程
一个标记读取方法首先跳过任意分隔符,然后读取一个以分隔符结束的标记;然后针对使用的方法将标记进行转换,(除了 next() 方法不进行转换)如果标记和期望的类型不匹配,那么就会抛出一个运行异常 InputMismatchException 。
基于标记的读取方法不能读取标记后面的分隔符。如果在基于标记的读取方法之后调用nextLine 方法,该方法读取从这个分隔符开始,到这行的分隔符结束的字符。这个行分隔符也会被读取,但不会是nextLine 方法返回的字符串的部分。
注意:不建议在一个基于标记的输入之后使用一个基于行的输入,后者往往会得到一个空字符串
public class ScannerDemo {
public static void main(String[] args) {
// 从控制台输入 hello 1 2.33
Scanner fromConsole = new Scanner(System.in);
String s = fromConsole.next();
int a = fromConsole.nextInt();
double b = fromConsole.nextDouble();
System.out.println(s + " " + a + " " + b);
fromConsole.close();
// 读取字符串
String input = "hello fish 1 fish 2.33 fish";
Scanner fromString = new Scanner(input).useDelimiter("\\s*fish\\s*");
String s2 = fromString.next();
int a2 = fromString.nextInt();
double b2 = fromString.nextDouble();
System.out.println(s2 + " " + a2 + " " + b2);
fromString.close();
}
}
3. 详解BufferedReader 类
BufferedReader 类使用中必须要使用try - catch模块或者在方法头声明 throws IOException;
常用 readLine() 方法,读取后可以调用字符串的split方法进行分割再进行后续的操作。
public class BufferedReaderDemo {
public static void main(String[] args) throws IOException {
// 从控制台输入 hello 回车 2.33 回车 2 回车
InputStreamReader ir = new InputStreamReader(System.in);
BufferedReader br = new BufferedReader(ir);
String line1 = br.readLine();
String line2 = br.readLine();
String line3 = br.readLine();
double b = Double.parseDouble(line2);
int c = Integer.parseInt(line3);
System.out.println(line1 + " " + b + " " + c);
}
}
4. 详解InputStreamReader 类
用于读取数据时,同样需要包含在try catch模块中,或者在方法头声明 throws IOException
java.io.InputStreamReader
5. ACM模式输入
5.1 使用Scanner
读取时有分隔符,默认为空格;输入时即可转换,较为方便;
初始化:Scanner sc = new Scanner(System.in);
多行输入时,while 循环条件可以为 sc.hasNext();
如果确定读取下一个值的类型,可以直接调用 nextInt() nextDouble() 等方法;
5.2 使用BufferedReader
比Scanner快,但是需要调用别的方法将字符串进行转换,读取时也没有分隔符;
初始化:BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
多行输入时,可以提前初始化一个字符串变量s,通过 (s = br.readLine() ) != null 进行判断;
按空格分割 String[] s_array = br.readLine().split(" ");