勿以恶小而为之,勿以善小而不为--------------------------刘备
劝诸君,多行善事积福报,莫作恶
上一章简单介绍了 打印输出流PrintStream和PrintWriter(五),如果没有看过,请观看上一章
一. Scanner 类
java.util.Scanner 类是 jdk1.5 之后出现的, 主要是方便读取 控制台输入的数据。当然,也可以读取文件的内容,但常用于接收控制台输入。
以前,我们要想接收控制台的输入信息,需要用到 System.in 的纯 InputStream情况。
如接收用户的年龄:
//注意,是字节读取,会存在乱码情况
public static void inTest() throws Exception{
System.out.println("请输入你的年龄:");
InputStream inputStream= System.in;
byte[] bytes=new byte[6];
//将输入的内容放置到 bytes 字节数组里
int len=inputStream.read(bytes);
String ageString=new String(bytes,0,len);
int age=Integer.parseInt(ageString);
System.out.println("用户的年龄是:"+age);
}
单单的接收一个年龄,就需要很多步骤,如果接收多个信息,则需要循环实例化读取,当接收中文字符串的时候,还需要处理中文乱码的问题。
很麻烦, 但是使用 新的 Scanner 类时,就非常方便了。
一.一 构造方法
一.一.一 方法
方法 | 作用 |
---|---|
Scanner(File source, String charsetName) | 传入文件和 字符编码 |
Scanner(InputStream source, String charsetName) | 传入InputStream 和 字符编码 |
Scanner(Path source, String charsetName) | 传入Path 对象和字符编码 |
一般用的是 InputStream 参数。
一.一.二 演示
@Test
public void conTest() throws Exception{
//第一种方式,传入文件 File
File file=new File("E:"+ File.separator+"ideaWork"+File.separator+"Java2"+File.separator+"fileSrc"
+File.separator+"out.txt");
Scanner scanner=new Scanner(file);
//2. 第二种,传入 InputStream
InputStream inputStream=new FileInputStream(file);
Scanner scanner1=new Scanner(inputStream);
//一般使用的是 System.in
Scanner scanner2=new Scanner(System.in);
//第三种, 还可以传入 Path
Path path= Paths.get("E:","ideaWork"+ File.separator+"Java2"+File.separator+"fileSrc"
+File.separator+"Hello.txt");
Scanner scanner3=new Scanner(path);
}
一.二 普通方法
Scanner 的方法有很多,只列举几个常用的。
方法 | 作用 |
---|---|
void close() | 关闭此扫描仪。 |
接收数据: | |
nextInt() | 接收数据,并转换成int 类型 |
nextFloat() | 接收数据,并转换成 Float类型 |
String next() | 接收数据,并转换成字符串,接收数据时,空格结束 |
String nextLine() | 接收数据,并转换成字符串, 接收数据时,回车键结束 |
–判断数据 | |
boolean hasNextInt() | 判断传入的数据,是否能转换成int类型 |
boolean hasNextFloat() | 判断传入的数据,是否能转换成float 类型 |
boolean hasNext() | 判断是否有下一个数据 |
boolean hasNextLine() | 判断是否有下一行数据 |
boolean hasNext(String pattern) | 判断是否符合 正则表达式 |
Scanner useDelimiter(String pattern) | 设置结束读取的标识符 |
二. 演示Scanner
二.一 读取单个数据 如 年龄
读取年龄时,用单纯的InputStream 时,会发现很难处理。 但是用 Scanner 时:
//接收前端传入的数据
public static void main(String[] args) {
try {
inputTest();
} catch (Exception e) {
e.printStackTrace();
}
}
public static void inputTest() throws Exception{
Scanner scanner=new Scanner(System.in);
//1. 输入name
System.out.println("请输入年龄:");
//会自动转换
int age=scanner.nextInt();
System.out.println("您输入的年龄是:"+age);
scanner.close();
}
运行程序,控制台输入年龄 24
会自动转换成相应的int 类型。
如果你输入的不是 数字型字符串,那么将会转换失败, 抛出 java.util.InputMismatchException 类型。
所以,通常在接收之前,会验证传入数据的合法性。
二.二 接收前验证数据
用 hasNextXxx() 进行验证。 当然,也可以自己写正则表达式进行验证
//main 方法中 调用 这个方法
public static void input1Test() throws Exception{
Scanner scanner=new Scanner(System.in);
//1. 输入name
System.out.println("请输入年龄:");
if(scanner.hasNextInt()){
int age=scanner.nextInt();
System.out.println("您输入的年龄是:"+age);
}else{
System.out.println("请输入正确的年龄数字");
}
scanner.close();
}
当输入非数字时,
二.三 重复接收不同类型的数据
public static void input2Test() throws Exception{
Scanner scanner=new Scanner(System.in);
System.out.println("请输入年龄:");
//1. 接收 int
int age=scanner.nextInt();
System.out.println("请输入成绩:");
//接收 float
float score=scanner.nextFloat();
System.out.println("请输入姓名:");
//接收 字符串
String name=scanner.next();
System.out.println("姓名是:"+name+",年龄是:"+age+",成绩是:"+score);
scanner.close();
}
可以用 next() 也可以用 nextLine() 进行接收字符串,不会造成中文乱码问题。 但是,这两者有什么区别呢?
next() 接收数据,是按照空格进行拆分的,每次读取时,读取到空格时会结束本次读取。
而 nextLine() 接收数据时,是按照回车键进行拆分的,每次读取时,读取到回车键时会结束本次读取。
二.四 next() 与 nextLine() 的区别
public static void input3Test() throws Exception{
Scanner scanner=new Scanner(System.in);
System.out.println("请输入内容:");
String n1=scanner.next();
System.out.println("输出内容next接收:"+n1);
/*String n2=scanner.nextLine();
System.out.println("输出内容 nextLine接收:"+n2);*/
scanner.close();
}
当用 next() 进行接收时,
发现,只会读取空格前面的 我是。
当用 nextLine() 进行接收时,
两者的结束标识是不一样的, 这个标识是可以自动设置的。 useDelimiter()
public static void input3Test() throws Exception{
Scanner scanner=new Scanner(System.in);
System.out.println("请输入内容:");
scanner.useDelimiter("\n");
String n1=scanner.next();
System.out.println("输出内容next接收:"+n1);
/* String n2=scanner.nextLine();
System.out.println("输出内容 nextLine接收:"+n2);*/
scanner.close();
}
这个时候,再输入空格时, 就不会结束了。
二.五 读取文件的内容
读取时,按行读取,需要判断是否还有下一行, 如果有,就读取。
传入参数,最好传入输入流, 统一。
public static void input4Test() throws Exception{
File file=new File("E:"+ File.separator+"ideaWork"+File.separator+"Java2"+File.separator+"fileSrc"
+File.separator+"out.txt");
InputStream inputStream=new FileInputStream(file);
Scanner scanner=new Scanner(inputStream);
int i=0;
//当还有数据时
while(scanner.hasNextLine()){
String line=scanner.nextLine();
System.out.println((++i)+":"+line);
}
scanner.close();
}
运行程序:
谢谢您的观看,如果喜欢,请关注我,再次感谢 !!!