ACM中Java输入输出

ACM中Java输入输出

最初写算法时,是用Scanner的。因为当时接触的测试数据基本都是以算法的复杂度为主,但是后面遇到大量的输入数据时。发现Scanner远远不能满足条件。下面列出几种常用的输入输出方式。(输出统一用printwriter,系统的system.out太慢,结尾要释放缓存才能输出,不然数据放在缓存中输不出来)

1. Scanner

Scanner 这个类最慢,但是最好用,因为这个类没有缓存处理,所以io方面大量输入读取特别慢。

Scanner sc=new Scanner(System.in);
PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out)); 

2. bufferedreader

bufferedreader这个类最不方便,但是可以满足大部分输入速度的需求,输入缺点就是只能按行读取数据,必要时需要字符串分割,转成int以及其他类型还需要转换。

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

这种输入方式只能输入字符串然后分割处理等等,效率比Scanner高很多

3. StreamTokenizer

StreamTokenizer这个类最快,相对第二种也好用很多,他的底层是用字符分割用,但是这样处理有很大局限性。输入string类型除了纯字母。否则混合输入会出错,特殊符号在字符串中输入也不行。

StreamTokenizer in=new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));
in.nextToken();int n=(int)in.nval;
in.nextToken();long p=(long)in.nval;
in.nextToken();double q=in.nval;
out.print(n);
out.flush();

这种输入方式效率最高,巨大的输入量也能快速处理。

其中bufferedreader最难用,Scanner最好用,但是streamtokenizer最快,刚开始可能用的不习惯,但是习惯就好了,毕竟这个影响太大了,至于输出。系统输出太慢。大量数据还会超时。

以上的转载请注明出处:https://javaforall.cn/144966.html

在这里插入图片描述

下面放上关于StreamTokenizer的例子:

import java.io.InputStreamReader;
import java.io.StringReader;
import java.io.StreamTokenizer;
import java.io.IOException;

public class Main {
    public static void main(String[] args) throws IOException {

        StreamTokenizer tokenizer = new StreamTokenizer(new InputStreamReader(System.in));
        tokenizer.nextToken();
        System.out.println(tokenizer.sval);

    }
}

输出:

E:\Java_DownLoad\jdk-19_windows-x64_bin\jdk-19.0.2\bin\java.exe "-javaagent:E:\Java_DownLoad\IntelliJ IDEA 2023.1.1\lib\idea_rt.jar=56485:E:\Java_DownLoad\IntelliJ IDEA 2023.1.1\bin" -Dfile.encoding=UTF-8 -Dsun.stdout.encoding=UTF-8 -Dsun.stderr.encoding=UTF-8 -classpath C:\Users\HP\Desktop\Ctest\test\redis_study\untitled\target\classes org.example.Main
1034254
null

Process finished with exit code 0

当输入的字符串为数字时,该串不会被读取。查阅资料后得知sval读取的是被定界符所包围的单词,单词是由一个单词要素后面跟着0个或者更多个单词要素或者数字要素组成的,而数字不是单词要素,例如,添加单词要素后:

import java.io.InputStreamReader;
import java.io.StringReader;
import java.io.StreamTokenizer;
import java.io.IOException;

public class Main {
    public static void main(String[] args) throws IOException {

        StreamTokenizer tokenizer = new StreamTokenizer(new InputStreamReader(System.in));
        tokenizer.ordinaryChars('0','9');
        tokenizer.wordChars('0', '9');
        tokenizer.nextToken();
        System.out.println(tokenizer.sval);

    }
}

输出

E:\Java_DownLoad\jdk-19_windows-x64_bin\jdk-19.0.2\bin\java.exe "-javaagent:E:\Java_DownLoad\IntelliJ IDEA 2023.1.1\lib\idea_rt.jar=56311:E:\Java_DownLoad\IntelliJ IDEA 2023.1.1\bin" -Dfile.encoding=UTF-8 -Dsun.stdout.encoding=UTF-8 -Dsun.stderr.encoding=UTF-8 -classpath C:\Users\HP\Desktop\Ctest\test\redis_study\untitled\target\classes org.example.Main
1028534
1028534

Process finished with exit code 0

你可能感兴趣的:(#,Java的零星知识,java,开发语言)