****扫描流(Scanner类)

如果要改进输出功能不足有打印流,随后又利用了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解决了。

猜你喜欢

转载自blog.csdn.net/weixin_33953384/article/details/87040386