Java 快读快输出
# 为什么要用快读快输出?
用Scanner类读入,简单熟练,但当数据比较大的时候(个人经验,洛谷数据过万,PTA数据过两千,建议使用快读),我们快读主要是使用io包的StreamTokenizer类。当数据的数量级为10^5时,用StreamTokenizer类差不多好像是要比Scanner快个300ms左右。 在算法实现中300ms 是一个非常大的数字了,它极有可能让你在TLE和AC之间无限试探。 快输出用的是io包的PrintWriter类,它比常规的输出也是快不少的,也是AC的一大法宝
# StreamTokenizer类的使用
用StreamTokenizer 快读读的数范围不能抄过1e16!否则可能会导致double转long丢失精度!一行一行读的建议直接用BufferedReader
下面介绍他的用法 (1)在使用他前,要导入io包 (2)在使用这个类时,函数要throws IOException (3)StreamTokenizer re = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in))); (4)每一次读入之前都要用**nextToken()**方法获取下一个数据 (5)读取数据的方法: sval方法读取字符串类型(以空格或者换行分隔),一次只能读一个字符串, nval方法读取数字类型数据。读取数字类型的数据时,默认为double类型,所以在读入的时候要强制转换类型
import java.io.*;
public class test {
public static void main(String args[]) throws IOException{
StreamTokenizer st = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
st.nextToken();
String str = st.sval;
st.nextToken();
double num1 = st.nval;
st.nextToken();
int num2 = (int)st.nval;
st.nextToken();
long num3 = (long)st.nval;
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
只想读字符串: 当只读字符串的时候就不需要加StreamTokenizer类,可以直接写成 BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); 也不需要nextToken方法
import java.io.*;
public class test {
public static void main(String args[]) throws IOException{
BufferedReader re = new BufferedReader(new InputStreamReader(System.in));
String x = re.readLine();
System.out.println(x);
}
}
2
3
4
5
6
7
8
9
字符串和数字混合读取:
import java.io.*;
public class test {
public static void main(String args[]) throws IOException{
BufferedReader re = new BufferedReader(new InputStreamReader(System.in));
StreamTokenizer r = new StreamTokenizer(re);
r.nextToken(); int n = (int)r.nval;
re.readLine(); //读掉数字后面的回车
String x = re.readLine();
System.out.println(n+" "+x);
// 输入
// 3
// afadfa
// 输出
// 3 afadfa
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# PrintWriter类的使用
把平时的输出的_System.out_替换成对应的快输出的_实例对象名_,最后记得 flush()
import java.io.*;
public class test {
public static void main(String args[]){
PrintWriter pw = new PrintWriter(new OutputStreamWriter(System.out));
pw.print();
pw.println();
pw.printf();
pw.flush();
}
}
2
3
4
5
6
7
8
9
10