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. EF Core HasQueryFilter 的小坑

    这是今天在实际项目中遇到的一个问题,Entity Framework Core 2.2 生成了下面的 SQL 语句,INNER JOIN 部分丑陋的 SQL 语句让人无法忍受. SELECT TOP( ...

  2. 虚拟机下hadoop1.1.2安装(单机版)与(集群版)

    (1)我的电脑环境 CentOS6.5,64位,在虚拟机下实现. (2)jdk1.6的安装 jdk我用的是1.6.0_27,自己在网上下载jdk-6u27-linux-x64.zip 先在/usr/l ...

  3. 【C++】括号匹配

    #include<iostream> #include<cstring> #include<cstdlib> #include<queue> using ...

  4. Libvmi实现分析

    LibVMI是一个专注于读写虚拟机内存的自省库,它能够监视虚拟机底层的运行细节并将其还原.LibVMI支持对Xen及KVM虚拟化平台上的运行虚拟机进行自省操作,针对KVM虚拟化平台,LibVMI对QE ...

  5. AOP代理对象生成

    AOP(Aspect-OrientedProgramming,面向方面编程)是OOP(Object-Oriented Programing,面向对象编程)的良好补充与完善,后者侧重于解决 从上到下的存 ...

  6. Redis可视化工具安装及常用操作操作

    可视化操作工具:RedisDesktopManager 下载地址:http://www.pc6.com/mac/486661.html 直接安装(傻瓜式安装,直接下一步就可以了)(有Mac和windo ...

  7. C#开启异步 线程的四种方式

    一.异步委托开启线程public static void Main(string[] args){ Action<int,int> a=add; a.BeginInvoke(3,4,nul ...

  8. MySQL的GTID复制与传统复制的相互转换

    主库:192.168.225.128:3307从库1:192.168.225.129:3307 Gtid作为5.6版本以来的杀手级特性,却因为不支持拓扑结构内开关而饱受诟病.如果你需要从未开启GTID ...

  9. 23.C# 语言的改进

    1.对象初始化器 class Curry { public string MainIngredient{get;set;} public string Style { get; set; } publ ...

  10. Google word/sheets 常见的使用:

    Google Sheets: 1, sheets 里面的单元格设置自动换行: 选中单元格: --> Format --> Text Wrapping --> Wrap(自动换行)/C ...