扫描流(Scanner)

BufferedReader 类有两个问题:

  • 它读取数据的时候只能够按照字符串返回:public String readLine() throws IOException
  • 所有的分隔符都是固定的。

在JDK1.5 后提供有一个java.util.Scanner的类,这个类专门负责解决所有输入流的操作问题。
构造方法:public Scanner(InputStream source) ,接收InputStream类对象,表示是由外部设置输入的位置。
在Scanner类里面定义了以下的两大组方法:

  • 判断是否有指定数据:public boolean hasNextXxx()
  • 取出数据:public 数据类型 nextXxx()

范例:以键盘输入为例

import java.util.Scanner;

public class ScannerTest {
    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更加的容易,并且操作更为直观。为了保持操作的统一性,建议不管是否有用都先加上hasNext()判断。

范例:输入一个数字—-double

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("输入");
        }
        scan.close();
    }
}

除了以上支持的各种类型外,也可以在Scanner输入数据的时候设置正则验证

范例:正则验证

import java.util.Scanner;

/**
 * @author liuwq
 *  Scanner 的正则验证
 */
public class ScannerRegularExpressions {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        System.out.println("请输入生日: ");
        if (scan.hasNext("\\d{4}-\\d{2}-\\d{2}")) {
            String str = scan.next("\\d{4}-\\d{2}-\\d{2}");
            System.out.println("输入内容: " + str);
        } else {
            System.out.println("生日输入格式错误!");
        }
        scan.close();
    }
}

在Scanner类的构造函数里面由于接收的类性事InputStream,所以可以设置一个文件的数据流,但是在进行文件读取的时候需要考虑到分隔符:public Scanner useDelimiter(String pattera)

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.Scanner;

/**
 * @author liuwq
 *  设置读取的分隔符
 */
public class ScannerDelimiter {
    public static void main(String[] args) throws IOException {
        Scanner scan = new Scanner(new FileInputStream(new File(
                "D:" + File.separator + "Document" + File.separator + "Document" + File.separator + "test1.txt")));
        scan.useDelimiter("\n");
        while (scan.hasNext()) {
            System.out.println(scan.next());
        }
        scan.close();
    }
}

总结:在以后的开发中,程序输出数据使用打印流,输入数据使用Scanner

InputStream 类的功能不足,被Scanner解决了
Reader类的功能不足,被BufferedReader解决了
OutputStream类的功能不足,被PrintStream解决了
Writer类的功能不足,被PrintWriter解决了

你可能感兴趣的:(CSDN_Java学习笔记,Java基础学习笔记)