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

标签:
javaconsolescannersystem.inread |
分类: 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();
从输入流中读取数据的下一个字节。返回0
到255
范围内的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[]
通过使用平台的默认字符集解码指定的 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());
}
}
API中解释:
虚拟机是否具有控制台取决于底层平台,还取决于调用虚拟机的方式。如果虚拟机从一个交互式命令行开始启动,且没有重定向标准输入和输出流,那么其控制台将存在,并且通常连接到键盘并从虚拟机启动的地方显示。如果虚拟机是自动启动的(例如,由后台作业调度程序启动),那么它通常没有控制台。如果此虚拟机具有控制台,那么它将由此类唯一的实例(可通过调用System.console()
方法获得)表示。如果没有可用的控制台设备,那么对该方法的调用将返回null。
四、BufferedReader
其实也是用的IO流这个就不多解释了,就这样吧。
try {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String s = br.readLine();
} catch (IOException e) {
e.printStackTrace();
}