快速输入/输出
Scanner 和 System.out java调用IO太慢了,
-
Scanner 每次读都需要调用 物理的IO机器, 所以读一定会超时
-
System.out 也一样, 每次读都需要调用IO
-
java分为两种读写 : 1. 字节流 , 2. 字符流 而 Scanner 和 System.out 就是 字节流
// 首先导入包
import java.io.*;
import java.util.*;
public class IOTest {
// 快速写对象 // 套一层 PrintWriter,使用 out 就和 System.out里的方法一样
private static PrintWriter out = new PrintWriter(
new BufferedWriter( // 将输出 给输出到 缓冲区里,最后在close刷新缓冲区
new OutputStreamWriter(System.out))); // 将输出 转成字符流
// 创建快速读对象
private static Read in = new Read();
public static void main(String[] args) throws IOException {
// 最重要的 ,输出要刷新缓冲区
out.close() ;
}
}
// 快速读
class Read{
// Tokenizer 是裁剪的意思
// StringTokenizer 就是做字符串裁剪的意思
private StringTokenizer st = new StringTokenizer("") ;
// Buffered 就是缓冲
// inputStreamReader 就是将字节流转为字符流
// 让后通过 BufferedReader 把 所有的输入 全部一次性给读到 一个 缓冲区里
// 后面要 读取数据 , 就直接从缓冲区里拿
private BufferedReader bf = new BufferedReader(new InputStreamReader(System.in)) ;
// 按Scanner相同的名字来定义方法
String next() throws IOException{ // readLine需要抛异常
//需要一个while 循环, 当 stringTokenizer 字符串裁剪没有东西的时候,
// 从缓冲区里取出一行 ,来 方便我们进行读操作
while(!st.hasMoreTokens()){
st = new StringTokenizer(bf.readLine());
}
// 缓冲区里有多行数据 , bf.readLine里把一行数据拿出来,给 st 字符串裁剪
// st.nextToken() 就是从这 一行数据里 , 裁剪一个数据出来
return st.nextToken() ;
}
//获取一行字符串
String nextLine() throws IOException{
return bf.readLine() ; // 直接返回一行数据
}
// 下面的方法就换成各个类型数据
int newInt() throws IOException {
return Integer.parseInt(next()) ;
}
long newLong() throws IOException {
return Long.parseLong(next());
}
float newFloat() throws IOException{
return Float.parseFloat(next()) ;
}
}