常规的Java输入方式是采用:
Scanner in = new Scanner(System.in); Scanner类是一种可以使用正则表达式来解析基本类型和字符串的简单文本扫描器,它的速度因为随着运行时间的增加会被JIT优化,进而逐渐变快,但是如果程序不是很大,而数据量比较大的话,那么就很容易读取速度特别慢。下面给出一种较为快速的读取数据方式。
这种方式的核心思想是利用BufferedReader每次从System.in中读取一行,然后再利用StringTokenizer进行字符串的标记解析,之后通过每个标记对应的不同的数据类型进行parse操作,接着再打包返回。
下面给出代码:
import java.util.*;
import java.io.*;
public class Main {
public static void main(String[] args) {
InputStream inputStream = System.in; //标准输入流
OutputStream outputStream = System.out; //标准输出流
//InputStream与OutputStream分别是一切字节输入流与字节输出流的超类
InputReader in = new InputReader(inputStream);
PrintWriter out = new PrintWriter(outputStream);
out.close();
}
static class InputReader { //使用静态内部类来实现
public BufferedReader reader; //输入缓冲区
public StringTokenizer tokenizer; //代表每一个将要输入的变量
public InutReader(InputStream stream) {
reader = new BufferedReader(new InputStreamReader(stream),32768);
//第一个变量代表从字节流转换到字符流,接着再建立输入缓冲区
//第二个变量代表缓冲区大小
tokenizer = null;
}
public String next() {
while(tokenizer == null || !tokenizer.hasMoreTokens()) { //用来判断当前行(保存在StringTokenizer)是否解析完毕
tokenizer = new StringTokenizer(reader.readLine());
} catch (IOException e) {
throw new RuntimeException(e);
}
return tokenizer.nextToken();
}
//以下为对输入数据的打包并返回
public int nextInt() {
return Integer.parseInt(next());
}
public long nextLong() {
return Long.parseLong(next());
}
public Double nextDouble() {
return Double.parseDouble(next());
}
}
}}