Java读取键盘上的输入
Scanner 太慢了!!
一般我们读取键盘上的输入用的是Scanner类,但是,Scanner的读取速度太慢了!!!参考以下链接:
更快的Java输入
BufferedReader 读取键盘输入
自定义类
利用BufferedReader 来读取,比Scanner要快非常多,首先创建一个类:
class Input{
BufferedReader buf;//用于键盘读取的缓冲流
StringTokenizer tok;//字符串解析器,用于分隔字符串。关于StringTokenizer在下一个章节。
//因为我们是用BufferedReader的readLine()方法一行一行读,所以要分割这一行字符串。java 默认的分隔符是空格("")、制表符(\t)、换行符(\n)、回车符(\r)。
}
构造器
既然是用于读取键盘输入,那就要用到标准输入流System.in,因此定义构造器:
Input(){
buf = new BufferedReader(new InputStreamReader(System.in));
}
方法
自定义方法中,next()方法是必要的,因为解析int、double等都需要用到,hasNext()非必要,可以整合在next(),也可以分开。
接下来的nextLine()、nextInt()、nextDouble()…等等,都是根据需要定义。
hasNext()
判断tok对象是否还有数据,因为我们是读取一行,例如如果是这样:“123 123 21 22”,空格会被当作分隔符,就会得到四个数据,每次我们只返回一个数据,因此,定义此方法:
boolean hasNext() {
//tok == null 表示tok为空对象,那么就创建一个,并且读取输入的一行作为要被解析的参数
//!tok.hasMoreElements() 表示tok已经没有数据了,那就重新创建一个
while (tok == null || !tok.hasMoreElements()) {
try {
tok = new StringTokenizer(buf.readLine());
} catch (Exception e) {
return false;
}
}
return true;
}
next()
每次返回一个数据一个被分割的数据
String next() {
if (hasNext())
//tok.nextToken() 返回从当前位置到下一个分隔符的字符串。
return tok.nextToken();
return null;
}
nextLine()
返回一行数据,则不需要经过tok处理
String nextLine(){
try {
return buf.readLine();
} catch (IOException e) {
return null;
}
}
nextInt()
返回一个int类型的数据
int nextInt() {
return Integer.parseInt(next());
}
nextDouble()
返回一个double类型的数据
double nextDouble() {
return Double.parseDouble(next());
}
nextLong()
返回一个long类型的数据
long nextLong() {
return Long.parseLong(next());
}
完整的代码
class Input {
BufferedReader buf;
StringTokenizer tok;
Input() {
buf = new BufferedReader(new InputStreamReader(System.in));
}
boolean hasNext() {
while (tok == null || !tok.hasMoreElements()) {
try {
tok = new StringTokenizer(buf.readLine());
} catch (Exception e) {
return false;
}
}
return true;
}
String nextLine(){
try {
return buf.readLine();
} catch (IOException e) {
return null;
}
}
String next() {
if (hasNext())
return tok.nextToken();
return null;
}
int nextInt() {
return Integer.parseInt(next());
}
long nextLong() {
return Long.parseLong(next());
}
double nextDouble() {
return Double.parseDouble(next());
}
}
StringTokenizer 类
Java StringTokenizer 属于 java.util 包,用于分隔字符串。
StringTokenizer 构造方法:
- 1. StringTokenizer(String str) :构造一个用来解析 str 的 StringTokenizer 对象。java 默认的分隔符是空格(“”)、制表符(\t)、换行符(\n)、回车符(\r)。
- 2. StringTokenizer(String str, String delim) :构造一个用来解析 str 的 StringTokenizer 对象,并提供一个指定的分隔符。
- 3. StringTokenizer(String str, String delim, boolean returnDelims) :构造一个用来解析 str 的 StringTokenizer 对象,并提供一个指定的分隔符,同时,指定是否返回分隔符。
StringTokenizer 常用方法:
- 1. int countTokens():返回nextToken方法被调用的次数。
- 2. boolean hasMoreTokens():返回是否还有分隔符。
- 3. boolean hasMoreElements():判断枚举 (Enumeration) 对象中是否还有数据。
- 4. String nextToken():返回从当前位置到下一个分隔符的字符串。
- 5. Object nextElement():返回枚举 (Enumeration) 对象的下一个元素。
- 6. String nextToken(String delim):与 4 类似,以指定的分隔符返回结果。