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 方法返回的字符串的部分。
注意:不建议在一个基于标记的输入之后使用一个基于行的输入,后者往往会得到一个空字符串
java.util.Scanner
Name | Tags |
---|---|
+ Scanner(source : File) | 创建一个Scanner,从指定的文件中产生扫描的值 |
+ Scanner(source : String) | 创建一个Scanner,从指定的字符串中产生扫描的值 |
+ close() | 关闭Scanner |
+ hasNext() : boolean | 如果Scanner还有更多数据可以读取,返回true |
+ next() : String | 从Scanner 中读取下一个标记作为字符串返回 |
+ nextLine() : String | 从Scanner 中读取一行,以换行结束 |
+ nextByte() : byte | 从Scanner 中读取下一个标记作为byte值返回 |
+ nextShort() : short | 从Scanner 中读取下一个标记作为short值返回 |
+ nextInt() : int | 从Scanner 中读取下一个标记作为int值返回 |
+ nextLong() : long | 从Scanner 中读取下一个标记作为long值返回 |
+ nextFloat() : float | 从Scanner 中读取下一个标记作为float值返回 |
+ nextDouble() : double | 从Scanner 中读取下一个标记作为double值返回 |
+ useDelimiter( pattern : String) : Scanner | 设置Scanner 的分隔符,并返回Scanner |
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方法进行分割再进行后续的操作。
java.io.BufferedReader
Name | Tags |
---|---|
+ BufferedReader (in : Reader, sz : int) | 创建一个指定输入缓存大小为 sz 的输入流实例 |
+ BufferedReader (in : Reader) | 创建一个默认输入缓存大小的输入流实例 |
+ read() : int | 读取一个字符并返回其对应的值,0~65535之间,如果是在输入流末尾,那么返回-1,如果输入不合法,抛出IOException |
+ read(cbuf : char[], off : int, len : int ) : int | 将字符输入流读取到给定的字符数组中,返回读取的字符数量,如果到达输入流的末尾,则返回-1 |
+ readLine() : String | 读取一行输入,该行应当以"\n" 或者 "\r" 或者 "\r\n" 作为结束,返回的字符串不包含用作结尾的字符 |
+ skip( n : long) : long | 跳过指定长度的字符输入,返回实际跳过的字符数量 |
+ ready() : boolean | 如果输入流缓存不为空,则说明buffered character stream已经准备好,返回true;否则返回false |
+ markSupported() : boolean | 如果该输入流支持 mark方法,返回true; |
+ mark( readAheadLimit : int) : void | 标记输入流的当前位置,如果再调用reset() 方法,那么将返回该位置 |
+ reset() : void | 返回最近 mark的位置 |
+ close() : void | 关闭输入流 |
+ lines() : Stream<String> | 返回一个字符串Stream,该Stream由BufferedReader读取的每行组成 |
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
Name | Tags |
---|---|
+ InputStreamReader ( in : InputStream) | 使用默认字符集创建输入流 |
+ InputStreamReader ( in : InputStream, charsetName : String) | 使用指定字符集创建输入流 |
+ InputStreamReader ( in : InputStream, cs : Charset) | 使用指定字符集创建输入流 |
+ InputStreamReader ( in : InputStream, dec : CharsetDecoder) | 使用指定字符解码集创建输入流 |
+ getEncoding() : String | 返回当前输入流使用的字符集名称 |
+ read() : int | 返回输入字符的数字 |
+ read(cbuf : char[], off : int, len : int ) : int | 读取字符到给定字符数组中 |
+ ready() : boolean | 判断输入流是否为空 |
+ close() : void | 关闭输入流 |
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(" ");
原文转载:http://www.shaoqun.com/a/757792.html
livingsocial:https://www.ikjzd.com/w/714.html
grab:https://www.ikjzd.com/w/841
Scanner,BufferedReader,InputStreamReader与ACM模式输入Scanner,BufferedReader,InputStreamReader与ACM模式输入1.Scanner,BufferedReader,InputStreamReader简介与对比2.详解Scanner类3.详解BufferedReader类4.详解InputStreamReader类5.AC
贝贝官网:https://www.ikjzd.com/w/1321
55海淘网:https://www.ikjzd.com/w/1723
斑马物联网:https://www.ikjzd.com/w/1316
2020年的跨境电商什么时候才能恢复正常?疫情后的跨境电商行业什么时候才能恢复?:https://www.ikjzd.com/articles/119342
真黑五?亚马逊海外购双重福利刺激消费!:https://www.ikjzd.com/articles/111689
韩国eBay发起消费趋势调查 用户更愿为高价产品买单:https://www.ikjzd.com/articles/116124
没有评论:
发表评论