Java的Scanner读取太慢!利用BufferedReader快速读取!

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 类似,以指定的分隔符返回结果。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值