IO高级应用-扫描流(Scanner)

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解决了

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值