Java中获取键盘输入值的方法
以前写算法都是C/C++写的,现在用Java写,虽然算法是独立于语言的,但是Java从键盘获取输入确实有些不一样。在C/C++中我们可以用scanf和cin来获取用户从键盘上的输入,但是在Java中并没有这种方法,不过代替的是BufferedReader、InputStreamReader、Scanner和System.in四种方法。

1.System.in

System.in返回的是InputStream指向命令行输入的字节流,它的read方法以字节流的方式来读取命令行的输入的数据。我们常用的有

 int System.read()                       //以字节的方式读取输入的第一字符,返回该字符的ASCII码

 int System.read(byte b[])              //以字节的方式把输入的字符放入byte数组中

 int System.read(byte b[], int off, int len)   //以字节的方式把输入的字符放入byte数组中  off是起始位置,len是最大读入的字节数。

示例:

  int num = System.in.read(); // 输入 abc
System.out.println(num); // 输出 97 PS:97是a的ASCII码值 // 定义一个byte数组
byte[] b = new byte[10]; // 输入 abc
int len = System.in.read(b);
System.out.println(len); // 输出 5 ,这里加上了回车键和换行键
System.out.println(Arrays.toString(b));
// 输出[97, 98, 99, 13, 10, 0, 0, 0, 0, 0]
// 这里的97 98 99 分别是a、b、c的ASCII码值,13,10分别是 回车键 和 换行键 的ASCII码值

2.BufferedReader

BufferedReader 从字符输入流中读取文本,缓冲各个字符,从而实现字符、数组和行的高效读取。

BufferedReader 的构造函数如下

  private static int defaultCharBufferSize = 8192;        //文本缓存大小的默认值

  public BufferedReader(Reader in) {
   this(in, defaultCharBufferSize);
} public BufferedReader(Reader in, int sz)

BufferedReader重要API:

/**
* Reads a line of text. A line is considered to be terminated by any one
* of a line feed ('\n'), a carriage return ('\r'), or a carriage return
* followed immediately by a linefeed.
*
* @param ignoreLF If true, the next '\n' will be skipped
*
* @return A String containing the contents of the line, not including
* any line-termination characters, or null if the end of the
* stream has been reached
*
* @see java.io.LineNumberReader#readLine()
*
* @exception IOException If an I/O error occurs
*/ String readLine(boolean ignoreLF) throws IOException // 这个是源码上的注释 public String readLine() throws IOException { //这里默认ignoreLF为false
  return readLine(false);
} public int read(char cbuf[], int off, int len) //以字节的方式把输入的字符放入char数组中 off是起始位置,len是最大读入的字节数。 //The character read, as an integer in the range 0 to 65535 (<tt>0x00-0xffff</tt>), or -1 if the end of the stream has been reached
public int read()

BufferedReader的最大特点就是缓冲区的设置。通常Reader 所作的每个读取请求都会导致对底层字符或字节流进行相应的读取请求,如果没有缓冲,则次调用 read() 或 readLine() 都会导致从文件中读取字节,并将其转换为字符后返回,而这是极其低效的。使用BufferedReader可以指定缓冲区的大小,或者可使用默认的大小。大多数情况下,默认值就足够大了。(如果我们是AC题的时候,在内存允许的情况下把缓存区设置为输入的大小为最佳哈!!)

因此,建议用 BufferedReader 包装所有其 read() 操作可能开销很高的 Reader(如 FileReader 和InputStreamReader)。

例如:

 BufferedReader in= new BufferedReader(new FileReader("foo.in"))    //将缓冲指定文件的输入。 

3.InputStreamReader
InputStreamReader是字节流通向字符流的桥梁:它使用指定的 charset 读取字节并将其解码为字符。它使用的字符集可以由名称指定或显式给定,或者可以接受平台默认的字符集

  InputStreamReader (InputStream  in)                        //  创建一个使用默认字符集的 InputStreamReader。 
InputStreamReader (InputStream in, Charset cs) // 创建使用给定字符集的 InputStreamReader。
InputStreamReader (InputStream in, CharsetDecoder dec) // 创建使用给定字符集解码器的 InputStreamReader。

InputStreamReader (InputStream in, String charsetName) // 创建使用指定字符集的 InputStreamReader。

InputStreamReader重要API

1  public int read()                                              //以字节的方式读取输入的第一字符,返回该字符的ASCII码

3  public int read(char cbuf[])                                  //以字节的方式把输入的字符放入char数组中

5  public int read(char cbuf[], int offset, int length)          //以字节的方式把输入的字符放入char数组中 offset是起始位置,length是最大读入的字节数。

每次调用 InputStreamReader 中的一个 read() 方法都会导致从底层输入流读取一个或多个字节。要启用从字节到字符的有效转换,可以提前从底层流读取更多的字节,使其超过满足当前读取操作所需的字节。 为了达到最高效率,可要考虑在 BufferedReader 内包装 InputStreamReader。

例如:

  BufferedReader in = new BufferedReader(new InputStreamReader(System.in));     //用InputStreamReader来构造BufferedReader

InputStreamReader最大的特点是可以指转换的定编码格式,这是其他类所不能的,从构造方法就可看出,这一点在读取中文字符时非常有用

 4.Scanner

java.util.Scanner是Java5的新特征,主要功能是简化文本扫描,这个类最实用的地方表现在获取控制台输入。当通过new Scanner(System.in)创建一个Scanner,控制台会一直等待输入,直到敲回车键结束,把所输入的内容传给Scanner,作为扫描对象。如果要获取输入的内容,则只需要调用Scanner的nextLine()方法即可。

Scanner也可以从字符串(Readable)、输入流、文件等等来直接构建Scanner对象,有了Scanner了,就可以逐段(根据正则分隔式)来扫描整个文本,并对扫描后的结果做想要的处理。

控制台扫描:

  Scanner sc = new Scanner(System.in);
while (true) {
String line = sc.nextLine();
if (line.equals("exit")) break; //如果输入为"exit",则退出
System.out.println("输入:" + line);
}

Scanner默认使用空格作为分割符来分隔文本,但允许你指定新的分隔符:

  // 默认以空格方式分割文本
Scanner sc = new Scanner("123 asdf sd 45 789 sdf asdfl,sdf.sdfl,asdf ......asdfkl las"); // 以自己制定方式分割文本,支持正则表达式
//sc.useDelimiter(" |,|\\."); while (sc.hasNext()) {
System.out.println(sc.next());
}

重要API:

  public Pattern delimiter()  //返回此 Scanner 当前正在用于匹配分隔符的 Pattern。

  public boolean hasNext()   //判断扫描器中当前扫描位置后是否还存在下一段。

  public boolean hasNextLine()   //如果在此扫描器的输入中存在另一行,则返回 true。

  public String next()        //查找并返回来自此扫描器的下一个完整标记。

  public String nextLine()    // 此扫描器执行当前行,并返回跳过的输入信息。
public int nextInt() //扫描下一个整数,依次类推还有Double、Floate、Long等
  ......

 5.Scaner和BufferedReader区别

Scanner一个可以使用正则表达式来分析基本类型和字符串的简单文本扫描器。 
BufferedReader 从字符输入流中读取文本,缓冲各个字符,从而提供字符、数组和行的高效读取

1)Scanner 使用分隔符模式将其输入分解为标记,默认情况下该分隔符模式与空白匹配。然后可以使用不同的 next 方法将得到的标记转换为不同类型的值。
2)BufferedReader 可以指定缓冲区的大小,或者可使用默认的大小。大多数情况下,默认值就足够大了,默认大小为8*1024 = 8192。 
3)通常,Reader 所作的每个读取请求都会导致对基础字符或字节流进行相应的读取请求。因此,建议用 BufferedReader 包装所有其 read() 操作可能开销很高的 Reader(如 FileReader 和 InputStreamReader)。

6.BufferedReader和InputStreamReader区别

BufferedReader的作用是针对带有换行符的文本内容的按行读取,同时要正确处理各种字符集的文本数据。BufferedReader一般创建时需要一个Reader的参数,由Reader去用流的方式读取数据。而BufferedReader只是解析流数据并组成一行一行的String。"而InputStreamReader是Reader的一个子类 。

InputStreamReader中通过StreamDecoder这个辅助类来完成的。 "An InputStreamReader is a bridge from byte streams to character streams: It reads bytes and decodes them into characters using a specified charset"

参考文章:

http://segmentfault.com/q/1010000000422506

http://www.cnblogs.com/lianghui66/archive/2013/09/05/3303546.html

http://zhidao.baidu.com/link?url=IKQMXphIlPtQVDNbPU7UV5LTxJLhG7rgebHRA60QW6QQNf0q337A1I0OKCYMdD5pcmZ0Hc74hemMMbi2K21Ina

Java中BufferedReader、InputStreamReader、Scanner和System.in区别的更多相关文章

  1. Java中BufferedReader和scanner

    Scanner 和BufferedReader同样能实现将键盘输入的数据送入程序, import java.io.*;import java.util.Scanner;public class C { ...

  2. Java中BufferedReader和scanner的对比

    Scanner 和BufferedReader同样能实现将键盘输入的数据送入程序, import java.io.*;import java.util.Scanner;public class C { ...

  3. 【Java学习笔记之二十九】Java中的"equals"和"=="的用法及区别

    Java中的"equals"和"=="的用法及区别 在初学Java时,可能会经常碰到下面的代码: String str1 = new String(" ...

  4. JAVA中局部变量 和 成员变量有哪些区别

    JAVA中局部变量 和 成员变量有哪些区别 1.定义的位置不一样<重点>***局部变量:在方法的内部成员变量:在方法的外部,直接写在类当中 2.作用范围不一样<重点>***局部 ...

  5. java中String new和直接赋值的区别

        Java中String new和直接赋值的区别     对于字符串:其对象的引用都是存储在栈中的,如果是编译期已经创建好(直接用双引号定义的)的就存储在常量池中,如果是运行期(new出来的)才 ...

  6. 【转】彻底弄懂Java中的equals()方法以及与"=="的区别

    彻底弄懂Java中的equals()方法以及与"=="的区别 一.问题描述:今天在用Java实现需求的时候,发现equals()和“==”的功能傻傻分不清,导致结果产生巨大的偏差. ...

  7. 转 Java中final、finally、finalize的区别与用法

    Java中final.finally.finalize的区别与用法   1.简单区别:final用于声明属性,方法和类,分别表示属性不可交变,方法不可覆盖,类不可继承.finally是异常处理语句结构 ...

  8. Java中print、printf、println的区别

    Java中print.printf.println的区别 区别 print:标准输出,但不换行,不可以空参: println:标准输出,但会自动换行,可以空参,可以看做:println()相当于pri ...

  9. Java中public,private,protected,和默认的区别

    Java中public,private,protected,和默认的区别 1.private修饰词,表示成员是私有的,只有自身可以访问: 2.protected,表示受保护权限,体现在继承,即子类可以 ...

  10. java中public与private还有protect的区别

    java中public与private还有protect的区别 总是忘记.

随机推荐

  1. 防止enter提交表单

    如何防止回车(enter)键提交表单,其实很简单,就一句话.onkeydown="if(event.keyCode==13)return false;"把这句写在from标签里面就 ...

  2. c++库函数 Map

    转载:https://blog.csdn.net/shuzfan/article/details/53115922 C++中map提供的是一种键值对容器,里面的数据都是成对出现的,如下图:每一对中的第 ...

  3. u-boot调试串口输出对应的系统函数

    接上Debug串口,启动机器,u-boot哗啦啦地打印一行行的字符.刚接触u-boot的时候,对机器后台做了什么,几乎一无所知. 如果要很有信心地定制出一个简单并且可靠的系统,或者快速完成一项新的任务 ...

  4. 如何安装 MySql 5.7.22

    你首先得去官网去下载一个zip文件,https://dev.mysql.com/downloads/mysql/ 以我所选版本为例,选择MYSQL Community Server 然后在右边选择你所 ...

  5. Spring Boot Thmeleaf的语法 day04

    一.Thmeleaf语法的使用 html格式的页面放在classpath:/templates/就会自动渲染. 1.在pom.xml导入 <dependency> <groupId& ...

  6. IIS宿主WCF服务*.svc Mime类型映射

    经常会遇到由于.net安装组件缺失,导致发布wcf服务后,访问wcf报.svc请求类型不支持 简单方法就是添加删除程序,修改.net组件安装选项,勾选http激活即可: 或者手工添加映射处理程序 1. ...

  7. opencart 3添加pdf文档下载功能

    opencart 3适合做外贸商城,如果能在产品页那边添加pdf文档功能是最好的,符合国外用户的使用习惯,增加客户的黏性.其实opencart已经有一个downloadable product可下载产 ...

  8. Lists.newArrayList的一个小坑

    把一个用户ID转换成List存储,最开始我使用的方法是: // 用户ID Integer userId = 120; // id 转 List List<integer> userIds ...

  9. sping Bean 的生命周期是如何被管理

    1. 实例化一个Bean,也就是我们通常说的new 2. 按照Spring上下文对实例化的Bean进行配置,也就是IOC注入 3. 如果这个Bean实现了BeanNameAware接口,会调用它实现的 ...

  10. ehcarts 四川地图

    vue 首先你要傻子地图就引入进来(没得的地图需要你json请求得到(这个json自己去找),然后你要注册这个地图,echarts有的话就不用注册) import "../../node_m ...