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 方法返回的字符串的部分。

注意:不建议在一个基于标记的输入之后使用一个基于行的输入,后者往往会得到一个空字符串

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 = &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

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(" ");

Scanner, BufferedReader, InputStreamReader 与ACM模式输入的更多相关文章

  1. Java -- 键盘输入 Scanner, BufferedReader。 系统相关System,Runtime。随机数 Randrom。日期操作Calendar

    1. Scanner 一个基于正则表达式的文本扫描器,他有多个构造函数,可以从文件,输入流和字符串中解析出基本类型值和字符串值. public class Main { public static v ...

  2. java.util.Scanner应用详解++扫描控制台输入

    java.util.Scanner应用详解   java.util.Scanner是Java5的新特征,主要功能是简化文本扫描.这个类最实用的地方表现在获取控制台输入,其他的功能都很鸡肋,尽管Java ...

  3. 面试 | Java 算法的 ACM 模式

    (Java 算法的 ACM 模式) 前言 经常在 LeetCode 上用核心代码模式刷题的小伙伴突然用 ACM 模式可能会适应不过来,把时间花在输入输出上很浪费时间,因此本篇笔记对 Java 算法的 ...

  4. ACM模式细节

    牛客网的ACM模式需要自己写输入输出,在这里简单记录一下: 基本答题框架: import java.util.*; public class Main{ public static void main ...

  5. 使用scanner工具类来获取用户输入的信息

    使用scanner工具类来获取用户输入的成绩信息. 步骤:1.导入java.util.Scanner包 2.创建Scanner对象 3.接受并保存用户输入的值 例子:通过用户输入来获取学生成绩 pac ...

  6. Java通过 Scanner 类来获取用户的输入

    通过 Scanner 类来获取用户的输入. import java.util.Scanner; Scanner s = new Scanner(System.in);// 从键盘接收数据  Syste ...

  7. javascript设计模式实践之策略模式--输入验证

    策略模式中的策略就是一种算法或者业务规则,将这些策略作为函数进行封装,并向外提供统一的调用执行. 先定义一个简单的输入表单: <!DOCTYPE html> <html> &l ...

  8. ACM字符串输入问题

    坑死了..竟然被这个问题困扰了大半个学期,今天搜来翻去终于弄明白了一些,以后固定用这几种用法好了不然总出错QAQ实际测试例子就没放了,死记这里就够用了T-T 概念: gets()函数:用来从标准输入设 ...

  9. Java中Scanner类在nextInt()后无法输入nextLine()的问题

    首先,Scanner是一个扫描器,它扫描数据都是去内存中一块缓冲区中进行扫描并读入数据的,而我们在控制台中输入的数据也都是被先存入缓冲区中等待扫描器的扫描读取.这个扫描器在扫描过程中判断停止的依据就是 ...

随机推荐

  1. 从源码剖析Go语言基于信号抢占式调度

    转载请声明出处哦~,本篇文章发布于luozhiyun的博客:https://www.luozhiyun.com/archives/485 本文使用的go的源码15.7 这一次来讲讲基于信号式抢占式调度 ...

  2. Amundsen在REA Group公司的应用实践

    REA Group是一家专门面向房地产与实业资产的跨国数字广告公司. 他们主要为消费者提供房地产购买.出售与租赁服务,同时发布各类房产新闻.装修技巧以及生活方式层面的内容.每一天,都有数百万消费者访问 ...

  3. Java学习之数组的简单用法

    •概念 其实所谓的数组指的就是一组相关类型的变量集合,并且这些变量可以按照统一的方式进行操作. 数组本身属于引用数据类型,那么既然是引用数据类型,这里面实际又会牵扯到内存分配: 而数组的定义语法有两种 ...

  4. mybatis-plus的Could not set property 'updateDate' of 'class com.example.pojo.User' with value 'Fri Jul 24 10:29:39 CST 2020' Cause: java.lang.IllegalArgumentException: argument type mismatch解决方案

    按照官网在写mybatis-plus的自动填充功能一直报错,发现官网的解说不全,数据库是datetime类型,java程序又是date,类型不匹配 org.mybatis.spring.MyBatis ...

  5. Redis系列-存储篇sorted set主要操作命令

    Redis系列-存储篇sorted set主要操作函数小结 redis支持有序集合,即sorted set.sorted set在set的基础上,增加了排序属性,是set的升级版.这里简要谈谈sort ...

  6. DAOS 分布式异步对象存储|数据平面

    DAOS 通过两个紧密集成的平面进行运转.数据平面处理繁重的运输操作,而控制平面负责进程编排和存储管理,简化数据平面的操作. 模块接口 I/O 引擎支持一个模块接口,该接口允许按需加载服务器端代码.每 ...

  7. jQuery核心函数和静态方法

    jQuery核心函数 从jQuery文档中可以看出,jQuery核心函数一共3大类4小类 jQuery(callback) 当DOM加载完成后执行传入的回调函数 <script> $(fu ...

  8. 【Android】修改Android Studio的SDK位置

    解决SDK占用C盘空间问题 由于Android Studio默认会将环境下载到C盘,会导致C盘空间被大量占用. 对于C盘窘迫的童鞋非常不友好. 可以通过修改SDK位置的方式缓解C盘空间焦虑. 打开&q ...

  9. ElementPlusViteStarterPnpm版本

    1 起因 由于最近Vite升级了2.x版本,项目中需要改动的东西有点多,本来想基于官方给出的starter重做,但是又看到了一个叫pnpm的仓库,构建速度会比原生npm/yarn快两倍以上: 因此模仿 ...

  10. 八戒转世投胎竟然是Java设计模式:桥接模式

    目录 示例 代码实例 桥接模式 定义 意图 主要解决问题 何时使用 优缺点 八戒转世投胎的故事 示例 请开发一个画图程序,可以画各种颜色不同形状的图形,请用面向对象的思 想设计图形 分析: 1.比如有 ...