1 ACM中java快速输入输出
大家都知道,在ACM竞赛中,对程序运行时间有非常严格的要求,所以大部分人喜欢用C/C++,因为C/C++比JAVA快,JAVA容易超时。然而JAVA语言本身也有很多C/C++所没有的优势,为了让我们可爱的JAVA不因为运行时间而被ACMers吐槽,也为了让JAVA在ACM竞赛中发挥它更大的价值,故总结出JAVA高速IO输入输出,下面模板已经过多次测试,各大在线测评网站都支持使用。java的Scanner 比较慢(出了名的了),如果需要输入 数量级的数据并输出同样数量级的数据,使用Scanner和System.out耗时将很可能超过1s。
1.1 使用 StreamTokenizer 和 PrintWriter
StreamTokenizer in = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));
判断文件结尾:
相当于Java的 while(scanner.hasNext()),或者C的 while(scanf("%d",&n)!=EOF),在 StreamTokenizer 类中判断文件结尾使用 while (in.nextToken() != StreamTokenizer.TT_EOF) ,StreamTokenizer.TT_EOF这个是个参数,就是相当于EOF了。
1.2 使用 BufferedReader (推荐上面那种)
BufferedReader input = new BufferedReader(new InputStreamReader(System.in));
/**
* 为了从流中获取标记,可以调用StreamTokenizer的nextToken()方法。
* 调用nextToken()方法以后
* 如果标记是字符串,可用 String s=st.sval
* 如果是整数用 int n=(int) st.nval
* 如果是浮点数用 int n=st.nval //st.navl默认解析出的格式是double
* StreamTokenizer.TT_EOF这是个参数,就是指文件尾,EOF
*/
/* 下面这是IO流包装,可以看不懂,直接套用就好*/
StreamTokenizer in = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));
in.nextToken();//第一个次读取前记得调用 in.nextToken()读下一个标记 nextToken()方法相当于让光标指向下一个位置,记得写
int a = (int) in.nval;/*获取整数*/
out.print(a);
out.flush();//这里如果不刷新,不会输出结果 刷新缓冲区,否则a会留在缓冲区
in.nextToken();
double b = in.nval;//st.navl默认解析出的格式是double
out.print(b);
out.flush();
in.nextToken();
String str = in.sval; /*注意:sval是获取不带空格的字符串,含有空格的字符串貌似无法读取。*/
out.print(str);/*输出语句*/
out.flush();/*刷新输出缓冲区*/
// 用于输入的对象
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.nval即可得到拉进来的数据
//如果不知道还有没有下一个数据,可以这么写
while (in.nextToken() != StreamTokenizer.TT_EOF) {
// 然后在这里重复上述的输入过程,并干一些别的事情
}
//输出
out.println(n);
out.printf("%d ", n);
//不管用上述的哪一种输出,最后记得flush
out.flush();
参考:https://www.cnblogs.com/likailiche/p/4462062.html