扫描流——Scanner类

BufferedReader类方便了对大文本数据文件的读取操作,但是它存在两个问题:

  • 读取数据的时候只能按照字符串返回:public String readLine() throws IOException。
  • 分隔符是固定的,以换行作为分隔符。

于是,就有了Scanner类来解决所有输入流的操作问题。

Scanner的构造方法(其中两个):

public Scanner(File source) throws FileNotFoundException
public Scanner(InputStream source)

是不是有点像PrintStream类构造方法的设计?

Scanner默认以空白(换行和空格都是)作为分隔符。可以手动设置分隔符:

public Scanner useDelimiter(String pattern)

常用的方法函数:

public boolean hasNext()
public String next()
public boolean hasNextXxx()
public xxx nextXxx()
public boolean hasNext(String pattern)
public String next(String pattern)

示例1:从键盘输入流读取数据

public class Main {
    public static void main(String[] args) throws IOException {
        Scanner scanner=new Scanner(System.in);
        while (true){
            if (scanner.hasNextInt()){
                System.out.println("输入的整数为:"+scanner.nextInt());
            }else if(scanner.hasNextDouble()){
                System.out.println("输入的小数为:"+scanner.nextDouble());
            }else if(scanner.hasNext("\\w{3}")){
                System.out.println("输入的三个字符为:"+scanner.next("\\w{3}"));
            }else {
                System.out.println("输入的字符串为:"+scanner.next());
            }
        }
    }
}

运行结果:

6-9 687wr o7.8 uuu p 98.5 4
输入的字符串为:6-9
输入的字符串为:687wr
输入的字符串为:o7.8
输入的三个字符为:uuu
输入的字符串为:p
输入的小数为:98.5
输入的整数为:4

示例2:从文件读取数据

首先在我的e盘下准备一个hello.txt文件,内容如下:

hello world天
嘻嘻 
1.4 4

java文件: 

import java.io.*;
import java.util.Scanner;

public class Main {
    public static void main(String[] args)  {
        Scanner scanner= null;
        try {
            scanner = new Scanner(new File("e:"+File.separator+"hello.txt"));
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
        scanner.useDelimiter("\n");
        while (scanner.hasNext())
            System.out.println(scanner.next());
    }
}

运行结果:

hello world天
嘻嘻 
1.4 4

一开始用new Scanner(File file)的构造函数总是读取不出文件内容,可是用new Scanner(FileInputStream in)实例化Scanner对象就可以读出来。后来发现原来是因为文件中存在中文的原因,然后我把它保存为utf-8的编码格式就可以读出来了。

总结

用Scanner类读取数据要比之前的BufferedReader方便,所以日后能使用Scanner就可以尽量使用Scanner读取。

Scanner类是InputStream类的完善,BufferedReader是Reader类的完善,PrintStream是OutputStream的完善,PrintWriter是Writer的完善。

你可能感兴趣的:(java)