java从控制台输⼊读取四种⽅法实现+原理
先总结⼀下⽤法,后⾯是详细介绍:
System.in 读取单个byte,可以读取ASCII码中的字符
InputStreamReader 读取单个\⼀串字符,这个字符可以是任意编码(并且可以指定编码⽅式)
BufferedReader 读取⼀⾏字符。
Scanner :最强最通⽤的⽅法,可以读取指定类型的字符。
⼀、System.in
这是⼀个标准输⼊流,并且可以通过它从键盘中获取字节流。
官⽅描述:
The "standard" input stream. This stream is already open and ready to supply input data. Typically this stream corresponds to keyboard input or another input source specified by the host environment or user.
ad():返回从键盘输⼊的字节流。
键盘输⼊的信息是⽤UTF-8编码的,⽽read()每次返回⼀个字节。也就是说假如输⼊是ASCII中的编码,刚好可以返回⼀个完整字符。
可以将read()的返回值强制转换为char。
(注: char类型实际是utf16存储的,但是对于ASCII码,utf-8和utf-16对应的数字都是⼀样的)
while(true){
char c =(char)ad();
System.out.println(c);
}
运⾏效果:(绿字为输⼊,⽩字为输出)
但是假如输⼊的是汉字,就⽐较⿇烦了。汉字的UTF-8是3字节。也就是说会返回3个byte
while(true){
System.out.println(ad());
}
230 177 137刚好是"汉"的utf-8编码
总结:ad()是按字节读取,可以⽤来读取ASCII码中的字符,不适合读取UTF-8中占多位的字符。
⼆、使⽤InputStreamReader将字节流转换为字符流读取
InputStreamReader ir =new InputStreamReader(System.in);
while(true){
char c =(ad();
System.out.println(c);
}
以上代码的效果是: 每次读取⼀个字符(⽽不是字节),也就是说,现在可以直接读取汉字了。
什么是InputStreamReader? 他是⼀个将字节流转换为字符流的“桥”。默认情况下,它可以将字节按UTF-8解码,并编码成char类型(即utf16),以在java中显⽰。
源码中的解释如下:
//An InputStreamReader is a bridge from byte streams to character streams: It reads bytes and decodes them into //characters using a specified charset. /**
* Creates an InputStreamReader that uses the default charset.
*
* @param in An InputStream
*/
public InputStreamReader(InputStream in){
super(in);
sd = StreamDecoder.forInputStreamReader(in,this,
Charset.defaultCharset());// ## check lock object
}
InputStreamReader还可以选定解码⽅式。⽐如:
InputStreamReader ir =new InputStreamReader(System.in,"UTF-16");
不过这样解析出来是乱码。因为键盘输⼊是UTF-8编码。
三、使⽤BufferedReader,利⽤缓存实现整⾏读取
如何读取⼀串字符呢?⾸先想到可以把字符全缓存到⼀个char[] 数组中
实际上,InputStreamReader的read⽅法就能实现这样的效果。
InputStreamReader ir =new InputStreamReader(System.in);
char[] buffer =new char[10];
while(true){
System.out.println(buffer);
}
buffer存储的内容是:
假如我们想仅读取⼀⾏数据怎么办?可以遍历查到’\n’,再⽤’\n’前⾯的字符中构造字符串。⽅法这⾥就不写了。
这样,我们通过⾃定义⼀个缓存区,实现了⼀串字符的读取。
java中提供了BufferedReader类,该类内置了缓存区,我们就可以实现整⾏读取,不需要⾃⼰再设置缓存区。
BufferedReader br =new BufferedReader(new InputStreamReader(System.in));
while(true){
String str = br.readLine();
System.out.println(str);
}
四、Scanner:格式化读取
这应该是最常⽤的读取⽅式
⾸先可以做到前⾯的读取⼀⾏字符的功能:
Scanner in =new Scanner(System.in);
while(true){
if(in.hasNextLine())
System.out.Line());
}
效果:
Scanner可以说集成了前⾯的各种输⼊⽅法。
1、字符串解码:Scanner构造时的参数是字节流,肯定需要解码才能转为字符,默认使⽤UTF-8解码,但是也可以指定其他解码⽅式Scanner in =new Scanner(inputStream,"UTF-16");
2、缓存输⼊字符。使⽤的是⼀个CharBuffer类作字符缓存,其内部是char[]存储的
3、将字符解析为基本类型。类似ParseInt等函数的作⽤。
nextInt()读取数字
Scanner in =new Scanner(System.in);
while(true){
if(in.hasNextLine())
System.out.Int()*10);
}
还可以指定进制:这⾥以20进制为例
Scanner in =new Scanner(System.in);
while(true){
if(in.hasNextLine())
System.out.Int(20));
}
nextint()方法(20进制中的j相当于10进制中的19)
另外还有其他的很多⽅法,不⼀⼀列举了,⽐较简单。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论