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