java  Scanner与BufferedReader读取键盘输入性能比较

      
   

1、Scanner和BufferedReader 性能比较

在java中常见的从键盘获取输入的方式有Scanner和BufferedReader,本文给出两种方式读取输入的性能比较。   
测试代码如下:  
package com.algorithm;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Scanner; /**
*
* @author Wennian
* @function 测试2种输入流方式的性能
*/
public class InputTest { public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
InputTest inputTest = new InputTest(); inputTest.testScanner();
inputTest.testBufferReader(); } public void testScanner(){
Scanner scn = new Scanner(System.in);
String str = scn.next();
long start = System.nanoTime();
while(!str.equals("EOF")){
str = scn.next();
}
long end = System.nanoTime();
System.out.println("testScanner:"+(end - start)/1000000 + "ms"); } public void testBufferReader() throws IOException{
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
String str = bf.readLine();
long start = System.nanoTime();
while(!str.equals("EOF")){
str = bf.readLine();
}
long end = System.nanoTime();
System.out.println("testBufferReader:"+(end - start)/1000000 + "ms"); } }
</span>

构造输入流,大约360KB的数据,由于JVM和系统等其他原因,测试时间每次不同,但测试结果一致,即:每一测试BufferedReader的时间都要小于Scanner

//----------360KB数据的结果-----------//
testScanner:112ms
testBufferReader:14ms

testScanner:145ms
testBufferReader:10ms

testScanner:90ms
testBufferReader:12ms

//--------1MB数据的结果----------//
testScanner:220ms
testBufferReader:27ms

从上面测试结果来看,Scanner的平均耗时是BufferedReader的10倍左右.

2、Scanner和BufferedReader的区别

在命令行模式下要输入数据至程序中时,我们可以使用标准输入串对象System.in.但是,我们并不经常直接使用它,因为System.in提供的 read方法每次只能读取一个字节的数据,而我们平时所应用的通常是读取一个字符串或者是一个数字,所以read方法所提供的功能,对我们来说并没有太大的用处.

       在Java SE 6中,可以使用Scanner类取得用户的输入,Scanner类位于java.util包中,如果你要使用Scanner取得用户输入的话,要加上 importjava.util.Scanner;这条语句.import的功能是告诉编译器,你将使用java.util包中的Scanner类.

我们来看一个例子:

import java.util.Scanner;
public class TestScanner{
public static void main(String[] args){
Scanner scan = new Scanner(System.in);
System.out.println("请输入一个字符串:");
System.out.println("您输入的字符串是:" + scan.next());
}
}

运行上面的程序,你将会看到你输入的字符串将在下面原样显示出来.

     我们来看看这个程序中每条语句的意思:

     new是创建一个对象,程序中new的意思是创建了一个Scanner类的对象scan.但是在创建Scanner类的对象时,需要用System.in 作为它的参数,也可以将Scanner看作是System.in对象的支持者,System.in取得用户输入的内容后,交给Scanner来作一些处理.

     Scanner类中提供了多个方法:

        next():取得一个字符串;

        nextInt():将取得的字符串转换成int类型的整数;

        nextFloat():将取得的字符串转换成float型;

        nextBoolean():将取得的字符串转换成boolean型;

用Scanner获得用户的输入非常的方便,但是Scanner取得输入的依据是空格符,包括空格键,Tab键和Enter键.当按下这其中的任一键时,Scanner就会返回下一个输入. 当你输入的内容中间包括空格时,显然,使用Scanner就不能完整的获得你输入的字符串.这时候我们可以考虑使用BufferedReader类取得输入.其实在Java SE 1.4及以前的版本中,尚没有提供Scanner方法,我们获得输入时也是使用BufferReader的.

        BufferedReader类位于java.io包中,所以要使用这个类,就要引入java.io这个包:import java.io.BufferedReader. 使用BufferedReader对象的readLine()方法必须处理java.io.IOException异常(Exception).使用BufferedReader来取得输入,理解起来要复杂得多.但是使用这个方法是固定的,每次使用前先如法炮制就可以了.

        BufferedReader buffer = new BufferedReader(new InputStreamReader(System.in));

        String text = buffer.readLine();

        readLine()方法会返回用户在按下Enter键之前的所有字符输入,不包括最后按下的Enter返回字符.

完整的示例程序如下:

import java.io.BufferedReader;
public class TestBufferedReader{
public static void main(String[] args) throws IOException{
BufferedReader buffer = new BufferedReader(new InputStreamReader(System.in));
System.out.println("请输入一串字符串");
String text = buffer.readLine();
System.out.println("您输入的字符串是:" + text);
}
}

参考:http://blog.csdn.net/cankingapp/article/details/8145234


java Scanner与BufferedReader读取键盘输入性能比较的更多相关文章

  1. Python打印到屏幕_读取键盘输入

    Python打印到屏幕_读取键盘输入: print( ): 打印输出括号中的值 print("hello") # hello strs = 'hello' print(" ...

  2. Java基础---Java---IO流-----读取键盘录入、InputStreamReader、转换流、OutputStreamWriter、InputStreamReader

    字符流: FileReader FileWriter BufferedReader BufferedWriter 字节流: FileInputStream FileOutputStream Buffe ...

  3. Java Scanner 类,获取用户输入的值

    Scanner 类使用步骤 1.导入java.util.Scanner import java.util.Scanner; 2.创建Scanner对象 Scanner scan = new Scann ...

  4. java编程基础篇-------> 从键盘输入一位整数,代表月份,编程判断指定月份属于一年中的哪个季度。如果是 12 月、1 月、2 月,就属于冬季。

    从键盘输入一位整数,代表月份,编程判断指定月份属于一年中的哪个季度.如果是 12月.1 月.2 月,就属于冬季:如果是 3 月.4 月.5 月,就属于春季:如果是 6 月.7 月.8 月,就属于夏季: ...

  5. python通过标准输入读取内容,读取键盘输入的内容?接收用户输入?

    需求说明: 在交互式脚本中,需要用户手动输入内容,并对内容进行处理.在这里记录下通过 python的内置函数input()读取标注输入的内容.默认的标准输入是键盘. 操作过程: 1.通过input() ...

  6. 大数据 - Java基础:读取键盘输入的方法

    Java中获取键盘输入值的三种方法 程序编写中,从键盘获取数据是一件非常普通又平常的事 C:scanf() C++:cin() C#:Read().ReadKey().ReadLine() Java没 ...

  7. Java读取键盘输入

    三种方法分别如下: 方法一:从控制台接收一个字符,然后将其打印出来 import java.io.*; public static void main(String [] args) throws I ...

  8. Python读取键盘输入

    Python提供了两个内置函数从标准输入读入一行文本,默认的标准输入是键盘.例如以下: raw_input input raw_input函数 raw_input() 函数从标准输入读取一个行.并返回 ...

  9. Java Scanner 类——获取用户的输入

    创建Scanner对象语法 Scanner scan = new Scanner(System.in); 使用next()获取输入的字符串 import java.util.Scanner; publ ...

随机推荐

  1. oracle学习总结5(游标、触发器、过程、方法)

    1:捕获plsql抛出的异常 declarev_ename emp.ename%type;beginselect ename into v_ename from emp where empno=10; ...

  2. [转]使用Oracle SQL Developer连接数据库并创建用户

    本文转自:http://blog.csdn.net/xw13106209/article/details/6594738 1.使用sys账户创建数据库连接 安装Oracle 11g会自带一个叫做SQL ...

  3. c# 远程监控(4) 接收端 RTP包重组 分屏显示

    我们在上一期使用RTP协议,并进行了配置,打包了视频数据,这一期我们就对发送的数据进行重组,并显示在接受端上.最后对其进行扩展,支持多客户端视频发送,并在接收端分屏显示.完成远程监控的模拟. 先来个效 ...

  4. BSP模型

    http://www.uml.org.cn/yunjisuan/201212191.asp Hama中最关键的就是BSP(Bulk Synchronous Parallel-"大型" ...

  5. croppic 图片裁剪

    #region 3.1.3 保存裁剪后的图片方法 +ContentResult TemplateCropImg() /// <summary> /// 保存裁剪后的图片方法 /// < ...

  6. OC基础-第1天

    #pragma mark - Day01_01_OC语言的历史(了解) 1) Objective - C 是一门面向对象的高级语言 2) Objective - C 简称 obj - C  \  OC ...

  7. 代码版本管理/SVN/Git

    代码版本管理 一.SVN 1.SVN diff(create patch) 遇到了一个问题: Index: 通信协议.doc ===================================== ...

  8. [Guava官方文档翻译] 2.使用和避免使用null (Using And Avoiding Null Explained)

    本文地址:http://www.cnblogs.com/hamhog/p/3536647.html "null很恶心." -Doug Lea "这是一个令我追悔莫及的错误 ...

  9. I/O继承关系图

    InputStream/OutputStream继承关系图

  10. linux 判断指定用户对指定目录具有的权限

    脚本名:power.sh 脚本内容: ------------------------------------------- 注意:必须以root 身份执行该脚本. 脚本power.sh 需要两个参数 ...