2021年5月23日星期日

Scanner, BufferedReader, InputStreamReader 与ACM模式输入

Scanner, BufferedReader, InputStreamReader 与ACM模式输入

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

NameTags
+ 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 = &quot;hello fish 1 fish 2.33 fish&quot;; Scanner fromString = new Scanner(input).useDelimiter(&quot;\\s*fish\\s*&quot;); String s2 = fromString.next(); int a2 = fromString.nextInt(); double b2 = fromString.nextDouble(); System.out.println(s2 + &quot; &quot; + a2 + &quot; &quot; + b2); fromString.close();}

}

3. 详解BufferedReader 类

BufferedReader 类使用中必须要使用try - catch模块或者在方法头声明 throws IOException;

常用 readLine() 方法,读取后可以调用字符串的split方法进行分割再进行后续的操作。

java.io.BufferedReader

NameTags
+ 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

NameTags
+ 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

跨境电商:https://www.ikjzd.com/

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

没有评论:

发表评论