加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

Java从控制台读取输入数据的几种方法[转]

(2013-09-23 07:51:06)
标签:

java

console

scanner

system.in

read

分类: Tech

原文:http://blog.csdn.net/uucai/article/details/9838077


一、System.in(最笨的方法)

首先看jdk的API。
http://s4/mw690/0026uWfMgy6TkW6PERBa3&690


System的静态字段in返回的是一个InputStream类型的对象,我们可以用读取输入流的方式对其进行读取。按API的说法“此流已打开并准备提供输入数据。通常,此流对应于键盘输入或者由主机环境或用户指定的另一个输入源。”键盘上按下的任何一个键都会被当做是输入值。InputStream包含方法read()、read(byte[] b)和read(byte[] b, int off, int len) 等方法用于读取输入流。

1、read();

从输入流中读取数据的下一个字节。返回0255范围内的int字节值。返回一个整型字节数据,该数据表示的是字节,因此是Unicode的第一个字节或是字符的ASCII码值。该方法是从一个流中一个一个的读取数据,因此是一个迭代的过程。如果到达流的末尾,则返回-1重复调用System.in.read()实际上是在遍历该流中的每一个字节数据。最常见的流是键盘输入流。以下为例:



import java.io.IOException;
public class Test1 {
 public static void main(String[] args) throws IOException {
  System.out.println("Please input:");
  int i = 0;
  while(i!=-1){
   i = System.in.read();
   System.out.println(i+":"+(char)i);
  }
 }
}
测试结果:


Please input:
ABCD
65:A
66:B
67:C
68:D
13:

10:

这里的13和10是读取的键盘的回车,我们在键盘上按一下回车键,实际上读取到的是两个字符,即“\r”(13)和“\n”(10)。字符“\r”表示回车,即光标回到当前行的行首而不换行;字符“\n”表示换行,即光标移到当前行的下一行行首。

  • \n: UNIX 系统行末结束符
  • \n\r: window 系统行末结束符
  • \r: MAC OS 系统行末结束符

2、read(byte[] b)

InputStream的read(byte[] b)同样是返回一个int值,但此处的用法跟read()完全不一样。此处是从输入流中读取一定数量的字节,并将其存储在缓冲区数组b中。以整数形式返回实际读取的字节数。如果b的长度为 0,则不读取任何字节并返回0;否则,尝试读取至少一个字节。如果因为流位于文件末尾而没有可用的字节,则返回值-1;否则,至少读取一个字节并将其存储在b中。将读取的第一个字节存储在元素b[0]中,下一个存储在b[1]中,依次类推。读取的字节数最多等于b的长度。设k为实际读取的字节数;这些字节将存储在b[0]b[k-1]的元素中,不影响b[k]b[b.length-1]的元素。此时我们有了byte数组,有了返回的字节数,就可以用String的构造方法String(byte[] bytes, int offset, int length)通过使用平台的默认字符集解码指定的 byte 子数组,构造一个新的String,即可返回键盘的输入。示例如下:



public class TestInput1 {
 public static void main(String[] args) {
  try{
   System.out.println("请输入:");
   byte[] b = new byte[1024];
   //读取数据
   int n = System.in.read(b);
   //转换为字符串
   String s = new String(b,0,n);
   //回显内容
   System.out.println("输入内容为:" + s);
  }catch(Exception e){}
 }
}

3、read(byte[] b, int off, int len)

和上面类似但读取的长度,位置做了限定API如下:将输入流中最多len数据字节读入byte数组。尝试读取len个字节,但读取的字节也可能小于该值。以整数形式返回实际读取的字节数
将读取的第一个字节存储在元素b[off]中,下一个存储在b[off+1]中,依次类推。读取的字节数最多等于len。设k为实际读取的字节数;这些字节将存储在b[off]b[off+k-1]的元素中,不影响b[off+k]b[off+len-1]的元素。

二、java.util.Scanner

从 JDK 5.0 开始,基本类库中增加了java.util.Scanner类,使用它的Scanner(InputStream source)构造方法,可以传入系统的输入流System.in而从控制台中读取数据。当通过new Scanner(System.in)创建一个Scanner,控制台会一直等待输入,直到敲回车键结束,把所输入的内容传给Scanner,作为扫描对象。如果要获取输入的内容,则只需要调用Scanner的nextLine()方法即可。

1、nextLine()

API此扫描器执行当前行,并返回跳过的输入信息。此方法返回当前行的其余部分,不包括结尾处的行分隔符。意思就是读出当前下标的一行,对它来讲每行就是他的分隔符。



import java.util.Scanner;
public class TestSc {
 public static void main(String[] args) {
  System.out.println("请输入:");
  Scanner sc = new Scanner(System.in);
  System.out.println(sc.nextLine());
 }
}

2、next()

查找并返回来自此扫描器的下一个完整标记。完整标记的前后是与分隔模式匹配的输入信息,Scanner默认使用空格作为分割符来分隔文本,但允许你指定新的分隔符如下例:



import java.util.Scanner;
public class TestSc {
 public static void main(String[] args) {
  Scanner sc = new Scanner("aa bb cc,dd,ee");
  //sc.useDelimiter(",");
  while (sc.hasNext()) {
   System.out.println(sc.next());
  }
 }
}

三、java.io.Console

从 JDK 6.0开始,基本类库中增加了java.io.Console类,用于获得与当前 Java虚拟机关联的基于字符的控制台设备。在纯字符的控制台界面下,可以更加方便地读取数据



import java.io.Console;
public class TestSc {
 public static void main(String[] args) {
  System.out.println("请输入");
  Console cs = System.console();
  if (cs == null) {
   throw new IllegalStateException("不能使用控制台");
  }
  System.out.println(cs.readLine());
 }
}
值得一提的是此方法只是在cmd命令窗口可以得到Console实例顺利运行,在IDE工具下如eclipse下得不到Console实例的,cs==null无法实现输入。
API中解释:

虚拟机是否具有控制台取决于底层平台,还取决于调用虚拟机的方式。如果虚拟机从一个交互式命令行开始启动,且没有重定向标准输入和输出流,那么其控制台将存在,并且通常连接到键盘并从虚拟机启动的地方显示。如果虚拟机是自动启动的(例如,由后台作业调度程序启动),那么它通常没有控制台。如果此虚拟机具有控制台,那么它将由此类唯一的实例(可通过调用System.console()方法获得)表示。如果没有可用的控制台设备,那么对该方法的调用将返回null

所以在 IDE的环境下,重新定向了标准输入和输出流,也是就是将系统控制台上的输入输出重定向到了 IDE 的控制台中。因此,在 IDE中不能使用这个程序。

四、BufferedReader

其实也是用的IO流这个就不多解释了,就这样吧。



try {
 BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
 String s = br.readLine();
} catch (IOException e) {
 e.printStackTrace();
}

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有