BufferedReader确实能够解决大文本数据的读取操作:
1. 它读取的数据只能够按照字符串返回
2. 所有的分隔符都是固定的
JDK1.5后提供一个java.util.Scanner的类。
这个类专门负责解决输入流的操作问题
java.util
类 Scanner
java.lang.Object
继承者 java.util.Scanner
一个可以使用正则表达式来解析基本类型和字符串的简单文本扫描器。
Scanner的核心方法:
boolean hasNext数据类型()
如果此扫描器的输入中有另一个标记,则返回 true。
数据类型 next数据类型()
查找并返回来自此扫描器的下一个完整标记。
1.键盘输入数据
package com.jluzh.system;
import java.util.Scanner;
public class ScanertTest {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
System.out.println("请输入内容:");
if(scan.hasNext()){
System.out.println("输入内容:"+scan.next());
}
scan.close();
}
}
Scanner与BufferedReader类的操作相比,Scanner更加的容易,并且操作更为直观
2.输入数字
package com.jluzh.system;
import java.util.Scanner;
public class ScannerDoubleTest {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);//此处直接抛出
System.out.println("请输入成绩:");//准备接收键盘输入数据
if(scan.hasNextDouble()){//表示输入的是一个小数
//表示输入的是一个小数
double score = scan.nextDouble();//省略了转型
System.out.println("输入内容:"+score);
}else{
System.out.println("输入的不是数字,错误!");
}
scan.close();
}
}
除了以上支持的各种类型外,也可以再Scanner输入数据的时候设置正则验证。
3.正则验证:
package com.jluzh.system;
import java.util.Scanner;
public class ScannerTest2 {
public static void main(String[] args) {
boolean flag = true;
while(flag){
Scanner scan = new Scanner(System.in);
System.out.println("请输入生日:");
if(scan.hasNext("\\d{4}-\\d{2}-\\d{2}")){
String bir = scan.next("\\d{4}-\\d{2}-\\d{2}");
System.out.println("输入的内容:"+bir);
flag = false;
scan.close();
}else{
System.out.println("输入的日期有误!");
}
}
}
}
在Scanner 类的构造里面由于接收的类型是InputStream,所以此时依然可以设置一个文件的数据流,但是在进行文件读取的时候需要考虑到分隔符的问题;
public Scanner useDelimiter(String pattern)
将此扫描器的分隔模式设置为从指定 String 构造的模式。
package com.jluzh.system;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.util.Scanner;
public class ScannerTest3 {
public static void main(String[] args) throws Exception {
Scanner scan = new Scanner(new FileInputStream(new File("E:"+File.separator+"IOtest"+File.separator+"BufferesReaderTest3.txt")));
scan.useDelimiter("\n");//设置读取的分隔符
while(scan.hasNext()){
System.out.println(scan.next());
}
scan.close();
}
}
现在使用Scanner读取数据的时候综合来讲的确比BufferedReader简单一些,所以在以后的开发之中,程序输出数据使用打印流,输入数据使用Scanner(如果发现Scanner不好用了,使用BufferedReader).
总结:
InputStream类的功能不足已经被Scanner解决了
Reader类的功能不足被BufferedReader解决了
OutputStream类的功能不足被PrintStream解决了
Writer类的功能不足被PrintWriter解决了