常见对象(Scanner的概述和构造方法原理)
Scanner
的概述: JDK5以后用于获取用户的键盘输入
Scanner
的构造方法原理:
Scanner(InputStream source)
System
类下有一个静态的字段:
public static final InputStream in;
标准的输入流,对应着键盘录入。
代码示例:
package org.westos.demo2;
import com.sun.javaws.WinExtensionInstallHandler;
import java.io.InputStream;
import java.util.Scanner;
/**
* @Author: Administrator
* @CreateTime: 2019-04-20 13:42
*/
public class ScannerDemo {
public static void main(String[] args) {
InputStream is = System.in;
//类 System
//static InputStream in “标准”输入流。
//in
//public static final InputStream in“标准”输入流。此流已打开并准备提供输入数据。通常,此流对应于键盘输入
//Scanner(InputStream source) 构造一个新的 Scanner,它生成的值是从指定的输入流扫描的。
Scanner scanner = new Scanner(is);
System.out.println("请输入一个字符串");
String s = scanner.nextLine();
System.out.println("你输入的是: "+s);
}
}
常见对象(Scanner类的hasNextXxx()和nextXxx()方法的讲解)
hasNextXxx()
用法:
hasNextXxx()
判断下一个是否是某种类型的元素, 其中Xxx可以是Int
, Double
等。
如果需要判断是否包含下一个字符串,则可以省略Xxx
nextXxx()
用法:
nextXxx()
获取下一个输入项。Xxx的含义和上个方法中的Xxx相同
当从键盘录入数据时使用nextXxx()
方法会存在一些问题:
代码示例:
package org.westos.demo2;
import java.util.Scanner;
/**
* @Author: Administrator
* @CreateTime: 2019-04-20 13:52
*/
public class ScannerDemo2 {
public static void main(String[] args) {
//当你使用Scanner先录入整数后用nextLine()录入字符串时,你会发现,我并没有输入字符串就结束了
//其实他把你上次敲的回车换行符,已经录入了,但是这不是我想要的效果,怎么解决。
//1.可以再录入字符串的时候,创建一个新对象 2.使用next()方法
Scanner sc = new Scanner(System.in);
System.out.println("请输入一个整数");
int num = sc.nextInt();
System.out.println("你输入的数字是:"+num);
sc=new Scanner(System.in);
System.out.println("请输入一个字符串");
String s = sc.nextLine();
//String s = sc.next();
System.out.println("你输入的字符串是:"+s);
}
}
通过这两种方法解决了问题,但是在使用next()
方法时依然会出现下面的状况
代码示例:
package org.westos.demo2;
import java.util.Scanner;
/**
* @Author: Administrator
* @CreateTime: 2019-04-20 13:59
*/
public class ScannerDemo3 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("请输入一个字符串");
//String s = sc.nextLine();
String s=sc.next(); //录入的字符串中,遇到第一个空格后,空格后面的内容就不录入
System.out.println(s);
}
}
如果使用nextLine()
方法,无论从键盘中录入的字符串中间有多少个空格,系统都会全部录入,但是如果使用next()
方法,当我录入的一个很长的字符串中间存在许多空格时,在录入到第一个空格时候就会截止,第一个空格后面的内容就不回再录入了
常见对象(Scanner获取数据出现的小问题及解决方案)
两个常用的方法:
public int nextInt()
:获取一个int类型的值
public String nextLine()
:获取一个String类型的值
public String next()
:获取一个String类型的值
常见对象(Scanner更深层次的应用)
代码示例:
package org.westos.demo3;
import java.util.Scanner;
/**
* @Author: Administrator
* @CreateTime: 2019-04-20 14:21
*/
public class ScannerUtils {
//私有化构造,在测试类中不能创建该类对象
private ScannerUtils() {
}
public static int getInputNumber(Scanner sc) {
int num = 0;
while (true) {
sc = new Scanner(System.in);
boolean b = sc.hasNextInt(); //a
if (b) {
num = sc.nextInt();
break;
} else {
System.out.println("你录入类型,不正确,请重新输入一个整数");
}
}
return num;
}
}
以上代码是自定义类,对构造方法私有化,私有化以后从外面不能创建该类的对象
以下是测试类代码:
package org.westos.demo3;
import java.util.Scanner;
/**
* @Author: Administrator
* @CreateTime: 2019-04-20 14:02
*/
public class MyTest {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("请输入一个整数");
int num = ScannerUtils.getInputNumber(sc); //调用测试类中的getInputNumber(Scanner sc)方法
System.out.println("录入的整数是" + num);
}
}
通过上述方法,可以确保用户输入的是int
型的整数,因为在程序编好后,是要交付给用户使用的,如果提示用户输入整数而用户不小心输成了其他类型,按照我们之前的做法,就会报错,所以为了提高程序的健壮性,可以通过上述的方法来提示用户直到用户输入正确为止。