📚 众所周知,Java的Scanner 是真的慢,要是放在算法上基本数据还没读完就TLE了,再加上今年参加的是Java的蓝桥杯竞赛,数据读写上可不能掉链子,于是乎,就有了这篇实现Java快速读写的文章。

介绍

在使用之前我先介绍下StreamTokenizer 类:

  • StreamTokenizer 说快但是也并没有比Scanner 快多少(反正没有scanf 快是真的)
  • 在使用时StreamTokenizer 会为每个数据解析为Token,他的nextToken方法用于读取下一个标记。
  • 它的nval字段用于获取具体的数据,返回类型是double所以要进行强转
  • 每次使用nval读入数据之前必须要调用nextToken
  • sval字段用于读取字符串

模板代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
import java.io.*;

/**
* Created By XuanRan on 2021/12/3
* 快速IO模板
*/
public class QuickIO {

private static StreamTokenizer in = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
private static PrintStream out = System.out;

public static void main(String[] args) throws IOException {
String s = next();
out.println(s);
out.flush();
out.close();
}

public static int nextInt() throws IOException {
in.nextToken();
return (int) in.nval;
}

public static String next() throws IOException {
in.nextToken();
return in.sval;
}
}

举例

以洛谷中P1177快速排序题目为例子,使用快速读写和Arrays的sort方法就能轻松通过此题,但如果使用Scanner提供的方法会相对慢100ms-300ms左右,在OI中相差100ms可是不小的差距了。

  • 快速读写方式
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
import java.io.*;
import java.util.Arrays;

/**
* Created By XuanRan on 2021/12/3
*/
public class P1177快速排序 {

static StreamTokenizer in = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
static PrintStream out = System.out;
static StringBuilder builder = new StringBuilder();

public static void main(String[] args) throws Exception {
int N = nextInt();
int[] arr = new int[N + 100];
for (int i = 1; i <= N; i++) {
arr[i] = nextInt();
}
Arrays.sort(arr, 1, N + 1);
for (int i = 1; i <= N; i++) {
builder.append(arr[i]).append(" ");
}
out.println(builder.toString());
}

private static int nextInt() throws Exception {
in.nextToken();
return (int) in.nval;
}

private static String next() throws Exception {
in.nextToken();
return in.sval;
}
}

P1177.png

  • 普通方式
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.io.StreamTokenizer;
import java.util.Arrays;
import java.util.Scanner;

/**
* Created By XuanRan on 2021/12/3
*/
public class P1177快速排序2 {

static StreamTokenizer in = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
static PrintStream out = System.out;
static StringBuilder builder = new StringBuilder();

public static void main(String[] args) throws Exception {
Scanner scanner = new Scanner(System.in);
int N = scanner.nextInt();
int[] arr = new int[N + 100];
for (int i = 1; i <= N; i++) {
arr[i] = scanner.nextInt();
}
Arrays.sort(arr, 1, N + 1);
for (int i = 1; i <= N; i++) {
System.out.print(arr[i] + " ");
}

}

private static int nextInt() throws Exception {
in.nextToken();
return (int) in.nval;
}

private static String next() throws Exception {
in.nextToken();
return in.sval;
}
}

P1177_2.png