java接收控制台输⼊的三种⽅法
第⼀种 in/out
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Scanner;
// System.in和System.out⽅法
//缺点⼀: 该⽅法能获取从键盘输⼊的字符,但只能针对⼀个字符的获取
//缺点⼆: 获取的只是char类型的。如果想获得int,float等类型的输⼊,⽐较⿇烦。
public static void CharTest(){
try{
System.out.print("Enter a Char:");
char i = (char)ad();
System.out.println("Yout Enter Char is:" + i);
}
catch(IOException e){
e.printStackTrace();
}
}
System是⼀个类,属于java.lang包它表⽰系统类
定义如下:
public final class System extends Object//此类为最终类,不能被继承。
它有以下两个重要的成员变量:
(1)in:它是⼀种输⼊流对像,它的源是键盘,可以读取⽤户从键盘输⼊的数据,在读取数据时会引起堵塞,直到⽤户按下Enter键,读取⽅法:
public int read(char c[],int off,int len)和public int read(char c[])。
(2)out:它是⼀种输出流对象,它的⽬的地是命令⾏窗⼝,写⼊⽅法:
public void write(char c[],int off,int len)和public void write(char c[])
in和out为System类的属性:
(1)public static final InputStream in//静态⽅法,⽤类名称直接调⽤,返回InputStream类,也就是说可以为InputStream实例化, 是 InputStream类型,字节流,程序使⽤它可读取键盘输⼊的数据。“标准”输⼊流。此流已打开并准备提供输⼊数据。通常,此流对应于键盘输⼊或者由主机环境或⽤户指定的另⼀个输⼊源。
nextint()方法(2)public static final PrintStream out//静态⽅法,⽤类名称直接调⽤,返回PrintStream类,也就是说可以为OutputStream实例化,System.out 是 PrintStream类型(是OutputStream的⼦类),字节流,
程序使⽤它可将数据输出到显⽰屏上。“标准”输出流。此流已打开并准备接受输出数据。通常,此流对应于显⽰器输出或者由主机环境或⽤户指定的另⼀个输出⽬标。
实际上在JAVA中也对IO给予了⼀定的⽀持,, System.out, 这3个流同样是常见的数据来源和数据流⽬的地。使⽤最多的可能是在控制台程序⾥利⽤System.out将输出打印到控制台上。JVM启动的时候通过Java运⾏时初始化这3个流,所以你不需要初始化它们(尽管你可以在运⾏时替换掉它们)。
第⼆种替换系统流
尽管 , System.out 这2个流是java.lang.System类中的静态成员(这2个变量均为final static常量),并且已经预先在JVM启动的时候初始化完成,你依然可以更改它们。
只需要把⼀个新的InputStream设置给System.in或者⼀个新的OutputStream设置给System.out,之后的数据都将会在新的流中进⾏读取、写⼊。
可以使⽤System.setIn(), System.setOut()⽅法设置新的系统流(这⼆个⽅法均为静态⽅法,内部调⽤了本地native⽅法重新设置系统流)。请记住,务必在JVM关闭之前冲刷System.out(调⽤flush()),确保System.out把数据输出到了⽂件中。
/
/ InputStreamReader和BufferedReader⽅法
// 优点: 可以获取键盘输⼊的字符串
// 缺点: 如何要获取的是int,float等类型的仍然需要转换
public static void ReadTest(){
System.out.println("ReadTest, Please Enter Data:");
InputStreamReader is = new InputStreamReader(System.in); //new构造InputStreamReader对象
BufferedReader br = new BufferedReader(is); //拿构造的⽅法传到BufferedReader中,此时获取到的就是整个缓存流
try{ //该⽅法中有个IOExcepiton需要捕获
String name = br.readLine();
System.out.println("ReadTest Output:" + name);
}
catch(IOException e){
e.printStackTrace();
}
}
InputStreamReader: 是字节流与字符流之间的桥梁,能将字节流输出为字符流并且能为字节流指定字符集如果不指定的话将采⽤底层操作系统的默认编码⽅式,可输出⼀个个的字符,它封裝了InputStream在⾥头,以较⾼级的⽅式⼀次读取⼀个⼀个字符。
BufferedReader: 它则是⽐InputStreamReader更⾼级,它封裝了StreamReader类,⼀次读取取⼀⾏的字符提供通⽤的缓冲⽅式⽂本读取,readLine读取⼀个⽂本⾏, 从字符输⼊流中读取⽂本,缓冲各个字符,从⽽提供字符、数组和⾏的⾼效读取。
java.io下⾯有两个抽象类:InputStream和Reader也就是分别表⽰字节流和字符流, InputStream是表⽰字节输⼊流的所有类的超类,提供的是字节流的读取,⽽⾮⽂本读取,这是和Reader类的根本区别。
Reader是⽤于读取字符流的抽象类,通常Reader 所作的每个读取请求都会导致对底层字符或字节流进⾏相应的读取请求,如果没有缓冲则每次调⽤ read() 或 readLine() 都会导致从⽂件中读取字节,并将其转换为字符后返回,⽽这是极其低效的。即⽤Reader读取出来的是char数组或者String ,使⽤InputStream读取出来的是byte数组。
那为什么需要InputStreamReader和BufferedReader互相配合,因为InputStreamReader是字节输出(汉字会被分为两个字节),⽽BufferedReader是它的“包装”(整⾏读取),效率更⾼,所以配合使⽤更好。可以通过BufferedReader 流的形式进⾏流缓存,之后通过readLine⽅法获取到缓存的内容。
第三种 Scanner
//Scanner类中的⽅法
//优点⼀: 可以获取键盘输⼊的字符串
//优点⼆: 有现成的获取int,float等类型数据,⾮常强⼤,也⾮常⽅便;
public static void ScannerTest(){
Scanner sc = new Scanner(System.in);
System.out.println("ScannerTest, Please Enter Name:");
String name = sc.nextLine(); //读取字符串型输⼊
System.out.println("ScannerTest, Please Enter Age:");
int age = sc.nextInt(); //读取整型输⼊
System.out.println("ScannerTest, Please Enter Salary:");
float salary = sc.nextFloat(); //读取float型输⼊
System.out.println("Your Information is as below:");
System.out.println("Name:" + name +"\n" + "Age:"+age + "\n"+"Salary:"+salary);
}
Scanner是Java5的新特征,主要功能是简化⽂本扫描。Scanner的中⽂意思就是扫描仪,也就是将⼀份数据从⼀个地⽅扫描并显⽰到另外⼀个地⽅。⼀个可以使⽤正则表达式来解析基本类型和字符串的简单⽂本扫描器。
Scanner使⽤分隔符模式将其输⼊分解为标记,默认情况下该分隔符模式与空⽩匹配。然后可以使⽤不同的 next ⽅法将得到的标记转换为不同类型的值。当通过new Scanner()创建⼀个Scanner,控制台会⼀直等待输⼊,直到敲回车键结束,把所输⼊的内容传给Scanner,作为扫描对象。⽽且Scanner类有⼀个假设,在输⼊结束时会抛出IOException,⽽Scanner类会把这个异常吞掉。
经常有⼈说使⽤Scanner的原因是因为它使⽤简便,不如说Scanner的构造器⽀持多种⽅式,构建Scanner的对象很⽅便。可以从字符串(Readable)、输⼊流、⽂件等等来直接构建Scanner对象,有了Scanner了,就可以逐段(根据正则分隔式)来扫描整个⽂本,并对扫描后的结果做想要的处理。
scanner好⽐⼀个带游标或者指针的扫描仪,调⽤其hasNextLine()好⽐将游标向前探索直到遇到⼀个换⾏符,如果这个过程中遇到字符串对象则返回true并且游标复位。调⽤其nextLine()⽅法其实就是游标向前探索直到遇到⼀个换⾏符,此时并不复位,⽽是游标直接定位到⽬标数据的下⼀⾏,并返回探索过程中检测到的数据包括空格。
java⾥常使⽤的⽅法next() 与 nextLine() 区别
next():
1、⼀定要读取到有效字符后才可以结束输⼊。
2、对输⼊有效字符之前遇到的空⽩,next() ⽅法会⾃动将其去掉。
3、只有输⼊有效字符后才将其后⾯输⼊的空⽩作为分隔符或者结束符。
next() 不能得到带有空格的字符串。
nextLine():
1、以Enter为结束符,也就是说 nextLine()⽅法返回的是输⼊回车之前的所有字符。
2、可以获得空⽩。import java.io.BufferedReader;
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论