Java的快读快输出

众所周知,Java Scanner类的读入的真的真的慢
在我们使用Scanner类进行读入数据时,数据一旦过万,他就会显得非常慢
而用StreamTokenizer类差不多好像是要比Scanner快个300ms左右
这个时间虽然感觉很短!! 但是在算法实现中300ms 已经是一个非常大的数字了,他极有可能让我们感受到什么叫 TLE TTTTTT

所以这里我建议我们用Java读入数据较为庞大时,我们可以使用StreamTokenizer类
下面介绍他的用法
(1)我们在使用他时,我们要导入io包,他时io包中的类
(2)在使用这个类时,函数要throws IOException
(3)StreamTokenizer re = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in))); 这是他的具体实现

StreamTokenizer 类中 有个方法是 nval 这个方法就是我们读取数据的方法,他默认是double类型的,所以我们在读入的时候要将他强制转换类型
下面来看实现

import java.io.*;
public class test {
	public static void main(String args[]) throws IOException{
		StreamTokenizer re = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
		re.nextToken(); int n = (int)re.nval;
		System.out.println(n);
	}
}

大家可以看到这里 我用了一个 nextToken()方法,这个方法是我们每次读入数据之前必须要写的,也就是我们读入一个数据之前就要写一个这个方法才行
比如上面如果我还要读入一个 m 那我就要写
re.nextToken(); int m = (int)re.nval; 总而言之就是读一个写一次就对了

下面有人会问了 ,你这个只能读入整数,那我读字符串怎么读呢?
当我们读字符串的时候我们就不需要加StreamTokenizer类
我们可以直接写成 BufferedReader re = new BufferedReader(new InputStreamReader(System.in));
来看代码

import java.io.*;
public class test {
	public static void main(String args[]) throws IOException{
//		StreamTokenizer re = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
		BufferedReader re = new BufferedReader(new InputStreamReader(System.in));
		String x = re.readLine();
		System.out.println(x);
	}
}

这样我们就可以读取字符串了,当然如果我们使用这种方法读取字符串的话,我们就不需要 之前的nextToken方法了哦
下面又有人会说了,那我要数字跟字符串一起读的时候我怎么办呢?
下面来看代码

import java.io.*;
public class test {
	public static void main(String args[]) throws IOException{
		BufferedReader re = new BufferedReader(new InputStreamReader(System.in));
		StreamTokenizer r = new StreamTokenizer(re);
		r.nextToken(); int n = (int)r.nval;
		String x = re.readLine();
		System.out.println(n+" "+x);
//		输入 
//		3
//		afadfa
//		输出
//		3
	}
}

大家注意 上面这种写法就会出现一个问题,我们想的是 读入一个整数,然后读入一个字符串,可是我们这里只读入了这个整数怎么办呢?
这个是因为我们读入整数的时候,把整数读走了,但是整数后面的回车并没有读走,我们如果直接使用readLine()来读的话 就会读不到下一行的字符串 所以这里我们应该在加一个readLine()来读掉那个回车
看代码

import java.io.*;
public class test {
	public static void main(String args[]) throws IOException{
		BufferedReader re = new BufferedReader(new InputStreamReader(System.in));
		StreamTokenizer r = new StreamTokenizer(re);
		r.nextToken(); int n = (int)r.nval;
		re.readLine();
		String x = re.readLine();
		System.out.println(n+" "+x);
//		输入 
//		3
//		afadfa
//		输出
//		3 afadfa
	}
}

这样我们就可以读整数,读字符串啦,数据大的时候还是推荐大家用这种方法读入数据
然后我们还要介绍一个快输出,这个输入也比System的那个输出要快哦,所以我们以后写数据大的程序时,可以这样写

import java.io.*;
public class test {
	public static void main(String args[]) throws IOException{
		BufferedReader re = new BufferedReader(new InputStreamReader(System.in));
		StreamTokenizer r = new StreamTokenizer(re);
		PrintWriter pr = new PrintWriter(new OutputStreamWriter(System.out));
		r.nextToken(); int n = (int)r.nval;
		re.readLine();
		String x = re.readLine();
		pr.println(n+" "+x);
		pr.flush();
//		输入 
//		3
//		afadfa
//		输出
//		3 afadfa
	}
}

使用PrintWriter输出时 记得最后加个flush(), ok 我们就学会快读快输出啦
有问题欢迎留言

发布了32 篇原创文章 · 获赞 5 · 访问量 862

猜你喜欢

转载自blog.csdn.net/shizhuba/article/details/105068631
今日推荐