基于Java11的测试,由于电脑性能的差异,测试使用的是jdk自带的javac/java编译和运行,但是由于磁盘的IO操作比较费时,数据不准确,参考了网上的测试结果,新手整理错误难免,希望大家多多指教 ``
(一)java.io.BufferedReader
public class Test {
public static void main(String[] args) throws Exception {
char c ;
BufferedReader bd = new BufferedReader(new InputStreamReader(System.in));
//read(),读入一个字符
System.out.println("input char,end with 'e'");
do {
c = (char)bd.read() ;
System.out.println(c);
}while(c != 'e') ;
//readLine(),读入每行的文本数据(包括空格)
String str=null ;
System.out.println("string end with 'end'");
do {
str = bd.readLine() ;
System.out.println(str);
}while(!str.equals("end")) ;
}
}
(二)java.util.Scanner
利用Scanner类进行输入之前最好使用hasNextXXX()验证一下,在使用next()读入数据。Scanner最常用,正常情况下都是是够用;不过当输入量和输出量太大的时候(达到百万到千万),那么这种输出方式就不够用了
Scanner scan = new Scanner(System.in) ;
if(scan.hasNext()) {
System.out.println(scan.next());//读取到有效的字符才结束,有效字符前的空白被自动去掉,有效字符后的空白被当作结束符,因此next()不能读取有空格的字符串
}
if(scan.hasNext()) {
System.out.println(scan.nextLine());//与BufferdeReader的readLine()类似,读入一行字符串以回车结束
}
Scanner类不仅支持输入字符串,还支持基本数据类型的输入。
Scanner scan = new Scanner(System.in) ;
int a=0,b=0 ;
if(scan.hasNextInt()) {//double,boolean,byte…类似
a = scan.nextInt() ;
b = scan.nextInt() ;
}
System.out.println(a+b);
scan.close();
//输入n组数据的格式
Scanner scan = new Scanner(System.in) ;
int a,b ;
int n = scan.nextInt() ;
for(int i=0;i<n;i++) {
a = scan.nextInt() ;
b = scan.nextInt() ;
}
scan.close();
(三)java.io.StreamTokenizer(读取数据最快的类)
用该类读取数据时只能读取由字母或数字组成的字符串,如果含有特殊符号,特殊符号占据一个令牌,并且返回null或者0,这是StreamTokenizer的缺点(该类居然还支持中文文本,hh),该类的读取规则为空白为分割符。可以利用该类对大文本进行符号,数字,字母进行快速统计
StreamTokenizer st = new StreamTokenizer(new BufferedReader
(new InputStreamReader(System.in))) ;
st.nextToken() ;//获得令牌
String str = st.sval ;//取出令牌,sval为该类的静态常量
//表示一个文本,以制表符,换行符,空格为分割符
st.nextToken() ;
int a = (int) st.nval ;//nval为该类的静态常量,表示读取的是个数字
System.out.println(str);
System.out.println(a);
(四)java.util.StringTokenizer类
令牌类的特点时读取数据的速度快,其底层采用的是字符分割的原理
StringTokenizer st = new StringTokenizer("this is in china") ;//默认是空格为分割符
while(st.hasMoreTokens()) {
System.out.println(st.nextToken());
}
StringTokenizer st1 = new StringTokenizer("this is my ida,and this is also yours"," ,") ; //自定义分割符
while(st1.hasMoreTokens()) {
System.out.println(st1.nextToken());
}
(五)控制台输出
a.java.io.PrintWriter
public class Test {(2306ms)
public static void main(String[] args) throws Exception {
PrintWriter pw = new PrintWriter(System.out) ;
long start = System.currentTimeMillis();
for(int i=0;i<1000000;i++) {
pw.println(i) ;
}
long end = System.currentTimeMillis() ;
pw.flush();
Thread.sleep(10000);
System.out.println("时间:"+(end-start));
pw.close();
}
}
b.System.out.println方法
public class Test {
public static void main(String[] args) throws Exception {
long start = System.currentTimeMillis();
for(int i=0;i<1000000;i++) {
System.out.println(i);
}
long end = System.currentTimeMillis() ;
System.out.println("时间:"+(end-start));
}
}
(六)测试
“in.txt”文件为1000000行的数字构成
a. Scanner(2930ms)
public class Test {
public static void main(String[] args) throws Exception{
Scanner scan = new Scanner(System.in) ;
long start = System.currentTimeMillis();
String str = null ;
for(int i=0;i<2000000;i++){
if(scan.hasNext()){
scan.next() ;
}
}
long end = System.currentTimeMillis();
System.out.println("time="+(end-start)+"ms");
}
}
b. BifferedReader(844ms)
public class Test {
public static void main(String[] args) throws Exception{
BufferedReader bd = new BufferedReader(new InputStreamReader
(new FileInputStream("in.txt"))) ;
long start = System.currentTimeMillis();
for(int i=0;i<2000000;i++){
bd.readLine() ;
}
long end = System.currentTimeMillis();
System.out.println("time="+(end-start)+"ms");
}
}
c. StreamTokenizer(time:433ms,因此该类读百万级数据应该压力不大)
public class Test {
public static void main(String[] args) throws Exception{
StreamTokenizer sc = new StreamTokenizer(new BufferedReader(new InputStreamReader
(new FileInputStream("in.txt"))));
int a = 0 ;
long start = System.currentTimeMillis();
for(int i=1;i<=2000000;i++){
sc.nextToken() ;
a = (int)sc.nval ;
}
long end = System.currentTimeMillis();
System.out.println("time="+(end-start)+"ms");
}
}
StreamTokenizer 如何将一行纯数字当作字符串读入。我在使用 StreamTokenizer 的时候假如输入纯数字得到的String 为null
可以看我发的文章
太棒了
bangbangbang
TQL 真的很棒
### TQL!
棒
orz