Java的输入输出优化-StreamTokenizer

Posted by 水的一匹Lu的Blog on Friday, September 6, 2019

TOC

前言:其实这篇文章早就应该记录了,因为一开始觉得这么笨的一个问题肯就我会不知道,但后来想想还是记录下来吧。说到控制台输入输出,肯定第一就想到当时上Java基础的时候老师讲过的Scanner,但殊不知Scanner的效率很低,因为我们平时测试的数据量小可能看不出速度慢来,但当碰到某些数据量大又对时间要求严格的题,同样的算法用Scanner输入就力不从心了。早期就碰到了一个这样的题,算法已经基本不能再优化,怎么提交都有一个点TLE,后来用了StreamTokenizer和PrintWriter对输入输出进行优化后,竟然就AC了。


先上大体结构:

StreamTokenizer in = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
        PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));

        while (in.nextToken() != StreamTokenizer.TT_EOF) {
            //输入数字用in.nval;这个地方注意in.nval输入的是double类型  
            //字符串用in.sval;
            //每次输入之后要想下一次输入,必须in.nextToken;获取
           // 最后输入完的时候都需要
        }

下面是引用在学习时候看到的文章中的一段话:

  • 类java.io.StreamTokenizer可以获取输入流并将其分析为Token(标记)。StreamTokenizer的nextToken方法将读取下一个标记
  • 默认情况下,StreamTokenizer认为下列内容是Token:字母、数字、除C和C++注释符号以外的其他符号。如符号“/”不是Token,注释后的内容也不是,而“\”是Token。单引号和双引号以及其中的内容,只能算是一个Token。
  • 要统计文件的字符数,不能简单地统计Token数,因为字符数不等于Token,按照Token的规定,引号中的内容就算是10页也算是一个Token。如果希望引号和引号中的内容都算作Token,应该通过StreamTokenizer的ordinaryChar()方法将单引号和双引号当做普通字符处理。

详细语法使用方法:

import java.io.*;

public class Test {
    //此处勿忘抛出异常
    public static void main(String[] args) throws IOException {
        StreamTokenizer in = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
        PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));

        while (in.nextToken() != StreamTokenizer.TT_EOF) {
            int a = (int)in.nval;
            in.nextToken();
            double b = in.nval;
            in.nextToken();
            String c = in.sval;
            /**
             * 具体算法实现模块,此处省略......
             *
             *
             */
            out.println(a);
            out.println(b);
            out.println(c);
            out.flush();
        }
    }
}

我们用同样的算法,同样的OJ平台测试同一道题目

下面是未用输入输出优化的编译结果:

not_use

下面是用到输入输出优化的编译结果:

use

经过测试,可见用StreamTokenizer和PrintWriter进行输入输出有着比较明显的速度提升。

「真诚赞赏,手留余香」

水的一匹Lu的Blog

真诚赞赏,手留余香

使用微信扫描二维码完成支付