笔试IO,事情起因
昨天参加某为的笔试,被一个输入卡死了;使用了Scanner输入,本地运行正确,结果一提交就出现CPU超时错误;当时没有注意到是Scanner的问题,一直解决不了,最终含恨而归…
在绝大多数时候,我们读入数据都是用Scanner类读入,简单快捷,但当数据比较大的时候读取很慢!所以需要使用快读。我们快读主要是使用io包的StreamTokenizer类。当读取数据的数量级达到10^3时,就很需要考虑使用StreamTokenizer类了,真的快很多。
下面开始总结使用的方法:
StreamTokenizer类快读:
每次读之前调用nextToken(),以空格分割;然后通过常量值获取数据。
StreamTokenizer st = new StreamTokenizer(new InputStreamReader(System.in));
st.nextToken();
String str = st.sval;//读取String类型数据
st.nextToken();
double num1 = st.nval;//读取double类型数据
st.nextToken();
int num2 = (int)st.nval;//读取int类型数据
st.nextToken();
long num3 = (long)st.nval;//读取long类型数据
如果只需要读取一行字符串,只需要使用BufferedReader : 以行为分割;
BufferedReader re = new BufferedReader(new InputStreamReader(System.in));
String x = re.readLine();
PrintWriter类快写:
PrintWriter类的使用相对而言比较简单,就是把我们平时的输出的System.out替换成对应的快输出的实例对象名,但是需要特别注意: 最后记得flush(),否则无法正常输出
PrintWriter pw = new PrintWriter(new OutputStreamWriter(System.out));
pw.print();//不换行输出
pw.println();//换行输出
pw.printf();//格式化输出
pw.flush();//关闭输出流
使用测试:
//快读快写测试
public static void main(String[] args) throws IOException {
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
String a = bf.readLine(); //只用于读取一行字符串
StreamTokenizer st = new StreamTokenizer(new InputStreamReader(System.in));
String b = bf.readLine();
st.nextToken();
String c = st.sval;
st.nextToken();
int d = (int)st.nval;
PrintWriter pw = new PrintWriter(new OutputStreamWriter(System.out));
pw.println(a +" "+ b +" "+ c +" "+d);
pw.println(22);
pw.flush();//关闭输出流
System.out.println( a +" "+ b +" "+ c +" "+d);
}
输入输出
//输入
qq
ww
tt
22
//输出
qq ww tt 22
22
qq ww tt 22
文章讲述了在Java编程中,当处理大量数据时,如何从使用Scanner转向StreamTokenizer进行快读,以提高效率。同时介绍了BufferedReader用于读取整行字符串以及PrintWriter进行快写的方法,强调了在使用PrintWriter时必须调用flush()来确保输出。

1094

被折叠的 条评论
为什么被折叠?



