Scanner(java.util.Scanner)

精准且简单,处理小数据好用,一开始学的读取键盘输入方法

原理:1.读字节 2.转字符 3.正则匹配 4.自动类型转换 5.同步锁 6.创建大量临时对象

Scanner = BufferedReader + 正则 + 自动解析

BufferedReader(java.io.BufferedReader)

处理字符串和中等数据,缺点是只能读字符串并且需要手动parseInt

原理:1.从 OS 一次读一大块字节 2.放入内存缓冲区 3.按字符解码 4.程序从缓冲区取数据 本质就是把数据从OS一个个读取变成只读一次,将数据转移到内存之后程序直接从内存里获取数据,省略了很多冗余步骤。

StreamTokenizer(java.io.StreamTokenizer)

速度快、适合大数据,无正则、无 GC 压力,缺点是不好读字符串

它本质上是一个极简的词法分析器,它并不把输入当作“对象”来处理,而是将其视为字符流。不断调用 read()读取下一个字符,如果是空白字符(空格、换行),直接丢弃,直到遇到第一个非空白字符,所以它无法读取换行和空格。

Scanner.nextInt()内部可能会先把字节解码成字符,再构建 String对象,最后调用 Integer.parseInt()。这会产生临时 String对象,用完即丢,触发GC(垃圾回收开销)。StreamTokenizer.nextToken()不会产生这样的临时对象,也就没有GC
 

BufferdReader和StreamTokenizer常用模板:

static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
static StreamTokenizer st = new StreamTokenizer(br);

static {
    st.ordinaryChar('-'); // 支持负数
}

static int nextInt() throws IOException {
    st.nextToken();
    return (int) st.nval;
} // 输入整数

static String nextWord() throws IOException {
    st.nextToken();
    return st.sval;
} // 输出字符串

更多推荐