Scanner 类
在JDK 1.5之前提供了 BufferedReader类方便用户进行输入流数据的读取操作,而从JDK 1.5开始为了进一步简化输入流的操作又提供了 Scanner类,本节将为读者讲解Scanner类的使用。
12.10.1 Scanner 类简介
在JDK 1.5之后Java提供了专门的输入数据类,此类不只可以完成之前的输入数据操作,也可以方便地对输入数据进行验证。此类存放在java.util包中,此类的常用方法如表12-14所示。
Scanner类可以接收任意的输入流。
在Scanner类中提供了 一个可以接收InputStream类型的构造方法,这就表示只要是字节输入流的子类都可以通过Scanner类案例化,以进行方便地读取。
12.10.2使用Scanner类输入数据
1.实例操作1——实现基本的数据输入
最简单的数据输入可以直接使用Scanner类的next()
方法实现。
【例.12.53】输入数据
package jiaqi;
import java.util.*;
public class demo420_1 {
public static void main(String[] args) {
// TODO 自动生成的方法存根
Scanner sc = new Scanner(System.in);
String str = sc.next();
System.out.println(str);
}
}
但是,如果在上面的程序中输入了带有空格的
内容,则只能取出空格之前的数据。造成这样结果的原因是Scanner将空格当作了一个分隔符,所以为了保证程序的正确,可以将分隔符号修改为“\n (回车)”。
【例12.54】修改输入数据的分隔符
package jiaqi;
import java.util.Scanner;
public class demo421_1
{
public static void main(String[] args)
{
Scanner sc = new Scanner(System.in);
//设置分隔符\n
sc.useDelimiter("\n");
String str = sc.next();
System.out.println(str);
}
}
上面程序完成了字符串内容的输入,如果要想输入int或float类型的数据,在Scanner类中也有支持,但是在输入之前最好先使用hasNextXxx()
方法进行验证,代码如下所示。
【例 12.55】输入 int、float
package jiaqi;
import java.util.Scanner;
public class demo421_2 {
public static void main(String[] args)
{
Scanner sc = new Scanner(System.in);
int INT;
float FLOAT;
System.out.println("输入int:");
if(sc.hasNextInt())
{
INT = sc.nextInt();
System.out.println("int=" + INT);
}
else
{
System.out.println("不是int");
}
System.out.println("输入float:");
if(sc.hasNextFloat())
{
FLOAT = sc.nextFloat();
System.out.println("FLOAT=" + FLOAT);
}
else
{
System.out.println("不是float");
}
}
}
2.实例操作2——实现日期格式的数据输入
Scanner类中没有提供专门的日期格式输入的操作,所以如果想得到一个日期类型的数据,用户必须自己编写正则验证,并手工转换。下面的代码演示了具体的操作。
【例12.56】得到日期
package jiaqi;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Scanner;
public class demo422_1
{
public static void main(String[] args)
{
// TODO 自动生成的方法存根
Scanner sc = new Scanner(System.in);
String str = null ;
Date date = null;
System.out.println("输入格式(yyyy-MM-dd))");
String pat = "^\\d{4}-\\d{2}-\\d{2}$";
if(sc.hasNext(pat))
{
str = sc.next();
try
{
date = new SimpleDateFormat("yyyy-MM-dd").parse(str);
}
catch (Exception e)
{
e.printStackTrace();
}
}
else
{
System.out.println("日期格式错误!!");
}
System.out.println(date);
}
}
3.实例操作3——从文件中得到数据
【例12.57】读取文件test.txt文件
package jiaqi;
import java.io.File;
import java.util.Scanner;
public class demo423_1 {
public static void main(String[] args)
{
String path = "d:" + File.separator + "test.txt";
File f = new File(path);
Scanner sc = null;
try
{
sc = new Scanner(f);
}
catch (Exception e)
{
e.printStackTrace();
}
StringBuffer str = new StringBuffer();
while (sc.hasNext())
{
String s = sc.next();
str.append(s).append("\n");
}
System.out.println(str);
}
}
从Scanner类的操作中可以发现,Scanner类有默认的分隔符,这样如果在文件中存在换行,则表示一次输入结束,所以本程序采用循环的方式读取,并在每次读完一行之后加入换行符,因为读取时内容需要反复修改,所以使用StringBuffer类以提升操作性能。