12.10 Scanner 类(血干JAVA系列)


在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类以提升操作性能。

  • 19
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阿斯卡码

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值