首页 > 编程语言 > 其他编程

编程语言Scanner, BufferedReader, InputStreamReader 与ACM模式输入

admin 其他编程 2021-05-25 09:22:28 输入 模式 BufferedReader Scanner 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(" ");

文章来源:https://www.cnblogs.com/weisite2019/p/14802326.html

后台-系统设置-扩展变量-手机广告位-内容正文底部
版权声明

本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。
本文地址:https://www.jcdi.cn/qtbc/30656.html

留言与评论(共有 0 条评论)
   
验证码:
后台-系统设置-扩展变量-手机广告位-评论底部广告位

教程弟

https://www.jcdi.cn/

统计代码 | 京ICP1234567-2号

Powered By 教程弟 教程弟

使用手机软件扫描微信二维码