如果要改进输出功能不足有打印流,随后又利用了BufferedReader解决了大文本读取功能不足的问题。但是有两个问题:
它读取数据的时候只能按照字符串返回:public String readline();
所有的分隔符都是固定的。
在JDK1.5以后,提供有一个java.util.Scanner类,这个类专门负责解决所有输入流的操作。
构造方法:public Scanner(InputStream in);表示外部接收的数据。
在Scanner类里面定义了以下两大组方法。
public boolean hasNext();
public String next();
public boolean hasNext(String pattern)
public String next(String pattern)
第一个操作:判断是否有指定数据
第二个操作:取出数据
范例:以键盘输入数据为例:
public static void main(String[] args) throws Exception{
Scanner scanner=new Scanner(System.in);
System.out.println("请输入内容");
if(scanner.hasNext()){
System.out.println("输入内容为"+scanner.next());
}
scanner.close();
}
Scanner与BufferedReader类操作相比 更加简单。
为了保持操作的统一性,都是用hasNext判断
范例:输入一个数字 double
public static void main(String[] args) throws Exception{
Scanner scanner=new Scanner(System.in);
System.out.println("请输入成绩");
if(scanner.hasNextDouble()){
double score=scanner.nextDouble();//省略了转型
System.out.println("输入内容为"+score);
}else{//表示输入的不是一个小数
System.out.println("输入的不是数字,错误");
}
scanner.close();
}
除了以上支持的各种类型外,也可以在Scanner输入数据的时候设置正则验证:
范例:正则验证
public static void main(String[] args) throws Exception{
Scanner scanner=new Scanner(System.in);
System.out.println("请输入生日");
if(scanner.hasNext("\\d{4}-\\d{2}-\\d{2}")){
String bir=scanner.next();//省略了转型
System.out.println("输入内容为"+bir);
}else{//表示输入的不是一个小数
System.out.println("输入的生日格式错误,错误");
}
scanner.close();
}
由于Scanner的构造接收的是InputStream,所以此时依然可以设置一个文件的数据流。但是在进行文件读取的时候,需要考虑到分隔符问题。
public Scanner useDelimiter(String pattern)
这是一个重要的方法,设置分隔符
public static void main(String[] args) throws Exception{
Scanner scanner=new Scanner(new FileInputStream(new File("E:"+File.separator+"my.txt")));
scanner.useDelimiter("\n");//设置换行为读取分隔符
while(scanner.hasNext()){
System.out.println(scanner.next());
}
scanner.close();
}
现在使用Scanner读取数据的时候综合来讲的确要比BufferedReader简单一些,所以在以后的时候。
程序输出数据使用打印流,输入数据使用Scanner(如果发现Scanner不好用了,使用BufferedReader)。
总结:
InputStream类的功能不足已经被Scanner解决了
Reader类的功能不足已经被BufferedReader解决了。
OutputStream类的功能不足被PrintStream解决了。
Writer类的功能不足被PrintWriter解决了。