欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Java IO编程: Scanner类

程序员文章站 2024-01-18 20:46:22
...

打印流解决的是OutputStream的缺陷, BufferedReader解决的是InputStream的缺陷, 而java.util.Scanner解决的是BufferedReader类的缺陷(替换了 BufferedReader类)
Scanner类 是一个专门进行输入流处理的程序类, 利用这个类可以方便的处理各种数据类型, 同时也可以结合正则表达式进行各项处理, 在这个类中主要关注以下的方法:

  1. 判断是否有指定类型的数据: public boolean hasNextXxx()
  2. 取得指定类型: public 数据 nextXxx()
  3. 定义分隔符: public Scanner useDelimiter(String pattern)
  4. 构造方法: public Scanner(InputStream source)

案例: 使用Scanner 实现数据的输入

package com.cwq.beyond;

import java.util.Scanner;

public class TestDemo02 {
	public static void main(String[] args) throws Exception {
		Scanner sc = new Scanner(System.in);
		System.out.println(" 请输入数据: ");
		if (sc.hasNext()) { // 现在有输入内容, 不判断空字符串
			System.out.println("[输入内容为]: "+ sc.next());
		}
		sc.close();
	}
}

Scanner 还可以接收各种数据类型, 并且帮助用户减少转型的处理。

案例: 接收其他数据类型的数据

package com.cwq.beyond;

import java.util.Scanner;

public class TestDemo02 {
	public static void main(String[] args) throws Exception {
		Scanner sc = new Scanner(System.in);
		System.out.println(" 请输入年龄: ");
		if (sc.hasNextInt()) { // 现在有输入内容, 不判断空字符串
			System.out.println("[输入内容为]: "+ sc.nextInt());
		}else 
			System.out.println("格式有误~");
		
		
		sc.close();
	}
}

最为重要的是, Scanner可以对接收的数据类型使用正则表达式进行判断

案例: 利用正则进行判断

package com.cwq.beyond;

import java.util.Scanner;

public class TestDemo02 {
	public static void main(String[] args) throws Exception {
		Scanner sc = new Scanner(System.in);
		System.out.println(" 请输入生日: ");
		if (sc.hasNext("\\d{4}-\\d{2}-\\d{2}")) { // 现在有输入内容, 不判断空字符串
			System.out.println("[输入内容为]: "+ sc.next());
		}else 
			System.out.println("格式有误~");
		
		
		sc.close();
	}
}

但是以上的操作在开发之中不会出现, 因为不可能让你编写一个命令行程序进行数据的输入操作

使用Scanner本身能够接收的是一个InputStream 类的对象, 那么也就意味着可以接收任何的输入流, 例如: 文件输入流

package com.cwq.beyond;

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

public class TestDemo02 {
	public static void main(String[] args) throws Exception {
		Scanner sc = new Scanner(new FileInputStream(new File("D:"+File.separator+"data.txt")));
		sc.useDelimiter("\n"); // 自定义分割符
		while (sc.hasNext()) {
			System.out.println(sc.next());
			
		}
	}
}

Scanner 实际上完美的替代了 BufferedReader, 而且更好的实现了 InputStream的操作, 因此以后除了二进制的文件拷贝之外, 那么只要针对于程序的信息输出都使用打印流, 信息的输入都使用Scanner 扫描流。