AcWing
  • 首页
  • 课程
  • 题库
  • 更多
    • 竞赛
    • 题解
    • 分享
    • 问答
    • 应用
    • 校园
  • 关闭
    历史记录
    清除记录
    猜你想搜
    AcWing热点
  • App
  • 登录/注册

OJ中Java常用的输入输出小结

作者: 作者的头像   zzw1 ,  2019-06-27 15:55:30 ,  所有人可见 ,  阅读 4960


27


48

基于Java11的测试,由于电脑性能的差异,测试使用的是jdk自带的javac/java编译和运行,但是由于磁盘的IO操作比较费时,数据不准确,参考了网上的测试结果,新手整理错误难免,希望大家多多指教 ``
(一)java.io.BufferedReader

public class Test {
    public static void main(String[] args) throws Exception {
        char c ;
        BufferedReader bd = new BufferedReader(new InputStreamReader(System.in));
        //read(),读入一个字符
        System.out.println("input char,end with 'e'");
        do {
            c = (char)bd.read() ;
            System.out.println(c);
        }while(c != 'e') ;
        //readLine(),读入每行的文本数据(包括空格)
        String str=null ;
        System.out.println("string end with 'end'");
        do {
            str = bd.readLine() ;
            System.out.println(str);
        }while(!str.equals("end")) ;
    } 
}

(二)java.util.Scanner
利用Scanner类进行输入之前最好使用hasNextXXX()验证一下,在使用next()读入数据。Scanner最常用,正常情况下都是是够用;不过当输入量和输出量太大的时候(达到百万到千万),那么这种输出方式就不够用了

Scanner scan = new Scanner(System.in) ;
        if(scan.hasNext()) {
            System.out.println(scan.next());//读取到有效的字符才结束,有效字符前的空白被自动去掉,有效字符后的空白被当作结束符,因此next()不能读取有空格的字符串
        }
        if(scan.hasNext()) {
            System.out.println(scan.nextLine());//与BufferdeReader的readLine()类似,读入一行字符串以回车结束
        }

Scanner类不仅支持输入字符串,还支持基本数据类型的输入。

Scanner scan = new Scanner(System.in) ;
        int a=0,b=0 ;
        if(scan.hasNextInt()) {//double,boolean,byte…类似
            a = scan.nextInt() ;
            b = scan.nextInt() ;
        }
        System.out.println(a+b);
        scan.close();

//输入n组数据的格式

Scanner scan = new Scanner(System.in) ;
        int a,b ;
        int n = scan.nextInt() ;
        for(int i=0;i<n;i++) {
            a = scan.nextInt() ;
            b = scan.nextInt() ;
        }
        scan.close();

(三)java.io.StreamTokenizer(读取数据最快的类)
用该类读取数据时只能读取由字母或数字组成的字符串,如果含有特殊符号,特殊符号占据一个令牌,并且返回null或者0,这是StreamTokenizer的缺点(该类居然还支持中文文本,hh),该类的读取规则为空白为分割符。可以利用该类对大文本进行符号,数字,字母进行快速统计

StreamTokenizer st = new StreamTokenizer(new BufferedReader
                (new InputStreamReader(System.in))) ;
        st.nextToken() ;//获得令牌
        String str = st.sval ;//取出令牌,sval为该类的静态常量
        //表示一个文本,以制表符,换行符,空格为分割符
        st.nextToken() ;
        int a = (int) st.nval ;//nval为该类的静态常量,表示读取的是个数字
        System.out.println(str);
        System.out.println(a);

(四)java.util.StringTokenizer类
令牌类的特点时读取数据的速度快,其底层采用的是字符分割的原理

StringTokenizer st = new StringTokenizer("this is in china") ;//默认是空格为分割符
        while(st.hasMoreTokens()) {
            System.out.println(st.nextToken());
        }
        StringTokenizer st1 = new StringTokenizer("this is my ida,and this is also yours"," ,") ;   //自定义分割符
    while(st1.hasMoreTokens()) {
            System.out.println(st1.nextToken());
        }

(五)控制台输出
a.java.io.PrintWriter

public class Test {(2306ms)
    public static void main(String[] args) throws Exception {
        PrintWriter pw = new PrintWriter(System.out) ;
        long start = System.currentTimeMillis();
        for(int i=0;i<1000000;i++) {
            pw.println(i) ;
        }
        long end = System.currentTimeMillis() ;
        pw.flush();
        Thread.sleep(10000);
        System.out.println("时间:"+(end-start));
        pw.close();
    }
}

b.System.out.println方法

public class Test {
    public static void main(String[] args) throws Exception {
        long start = System.currentTimeMillis();
        for(int i=0;i<1000000;i++) {
            System.out.println(i);
        }
        long end = System.currentTimeMillis() ;
        System.out.println("时间:"+(end-start));
    }
}

(六)测试
“in.txt”文件为1000000行的数字构成
a. Scanner(2930ms)

public class Test {
    public static void main(String[] args) throws Exception{
        Scanner scan = new Scanner(System.in) ;
        long start = System.currentTimeMillis();
        String str = null ;
        for(int i=0;i<2000000;i++){
            if(scan.hasNext()){
                scan.next() ;
            }
        }
        long end = System.currentTimeMillis();
        System.out.println("time="+(end-start)+"ms");
    }
}

b. BifferedReader(844ms)

public class Test {
    public static void main(String[] args) throws Exception{
        BufferedReader bd = new BufferedReader(new InputStreamReader
            (new FileInputStream("in.txt"))) ;
        long start = System.currentTimeMillis();
        for(int i=0;i<2000000;i++){
            bd.readLine() ;
        }
        long end = System.currentTimeMillis();
        System.out.println("time="+(end-start)+"ms");
    }
}

c. StreamTokenizer(time:433ms,因此该类读百万级数据应该压力不大)

public class Test {
    public static void main(String[] args) throws Exception{
        StreamTokenizer sc = new StreamTokenizer(new BufferedReader(new InputStreamReader
            (new FileInputStream("in.txt"))));
        int a = 0 ;
        long start = System.currentTimeMillis();
        for(int i=1;i<=2000000;i++){
            sc.nextToken() ;
            a = (int)sc.nval ;
        }
        long end = System.currentTimeMillis();
        System.out.println("time="+(end-start)+"ms");
    }
}

8 评论


用户头像
acwing_143   2021-02-17 19:32         踩      回复

StreamTokenizer 如何将一行纯数字当作字符串读入。我在使用 StreamTokenizer 的时候假如输入纯数字得到的String 为null

用户头像
Kind   2021-05-01 20:11         踩      回复

可以看我发的文章


用户头像
福尔摩东   2021-02-14 21:40         踩      回复

太棒了


用户头像
JP失ぜ魂ぉ   2019-09-07 02:00         踩      回复

bangbangbang


用户头像
wuog   2019-08-11 08:20         踩      回复

TQL 真的很棒


用户头像
song666   2019-07-06 11:26         踩      回复

### TQL!


用户头像
秦淮岸灯火阑珊   2019-06-28 18:45         踩      回复

棒

用户头像
zzw1   2019-06-29 00:55         踩      回复

orz


App 内打开
你确定删除吗?
1024
x

© 2018-2025 AcWing 版权所有  |  京ICP备2021015969号-2
用户协议  |  隐私政策  |  常见问题  |  联系我们
AcWing
请输入登录信息
更多登录方式: 微信图标 qq图标 qq图标
请输入绑定的邮箱地址
请输入注册信息