目录
Java中的Scanner
类是java.util
包中的一个实用工具类,用于从不同的输入源读取数据,并将这些数据转换为Java中的基本类型或字符串。
一、导入Scanner类
要使用Scanner
类,首先需要导入java.util.Scanner
包,这是Java中所有类使用外部类时的常规做法。
import java.util.Scanner;
二、创建Scanner对象
创建Scanner
对象时,需要指定输入源。常见的输入源包括标准输入流System.in
(通常用于从键盘读取数据)、文件输入流(用于从文件读取数据)以及字符串输入流(用于从字符串读取数据)。
1. 从控制台读取输入:
Scanner scanner = new Scanner(System.in);
2. 从文件读取输入:
Scanner scanner = new Scanner(new File("filename.txt"));
3. 从字符串读取输入:
String input = "Hello World";
Scanner scanner = new Scanner(input);
三、读取不同类型的数据
Scanner
类提供了多种方法来读取不同类型的数据,包括整数、浮点数、布尔值和字符串等。
以下是一些常用的方法:
-
读取整数:
int i = scanner.nextInt();
-
读取浮点数:
float f = scanner.nextFloat();
-
读取双精度浮点数:
double d = scanner.nextDouble();
-
读取布尔值:
boolean b = scanner.nextBoolean();
-
读取字符串:
String s = scanner.next(); // 读取一个单词
String line = scanner.nextLine(); // 读取一行文本
四、检查输入是否可用
在读取数据之前,可以使用 hasNextXXX()
方法来检查输入是否可用,这些方法返回一个布尔值,表示是否存在下一个指定类型的输入。
-
检查是否有下一个整数:
if (scanner.hasNextInt()) {
int i = scanner.nextInt();
}
-
检查是否有下一个浮点数:
if (scanner.hasNextFloat()) {
float f = scanner.nextFloat();
}
-
检查是否有下一个双精度浮点数:
if (scanner.hasNextDouble()) {
double d = scanner.nextDouble();
}
-
检查是否有下一个布尔值:
if (scanner.hasNextBoolean()) {
boolean b = scanner.nextBoolean();
}
-
检查是否有下一个字符串:
if (scanner.hasNext()) {
String s = scanner.next();
}
-
检查是否有下一行文本:
if (scanner.hasNextLine()) {
String line = scanner.nextLine();
}
五、两种常用的字符串输入方法
1. next()方法
next()
方法用于读取下一个完整的标记(token),默认情况下,标记是由空白字符(空格、制表符、换行符等)分隔的字符串。next()
方法会自动去除输入前的空白字符,并且在读取到有效字符后,将后续的空白字符视为分隔符或结束符。
import java.util.Scanner;
public class Demo {
public static void main(String[] args) {
//创建一个键盘对象,用于接收键盘数据
Scanner sc = new Scanner(System.in);
System.out.print("请输入字符串:");
//输入:hello world
String s = sc.next();
System.out.println("输入的字符串是:" + s);
//输出:hello
}
}
在本例子中,next()
方法在读取字符串时,遇到空格后停止读取,因此s
的值为"hello"
。
2. nextLine()方法
nextLine()
方法用于读取输入中的下一行文本。它返回一个字符串,该字符串包含从当前位置到行尾的所有字符,可以包含空白字符,但不包括行尾的换行符。
import java.util.Scanner;
public class Demo {
public static void main(String[] args) {
//创建一个键盘对象,用于接收键盘数据
Scanner sc = new Scanner(System.in);
System.out.print("请输入字符串:");
//输入:hello world
String s = sc.nextLine();
System.out.println("输入的字符串是:" + s);
//输出:hello world
}
}
在本例子中,nextLine()
方法读取了整行输入,包括空格,因此s
的值为"hello world"
。
六、注意事项
-
关闭 Scanner 对象:在使用完
Scanner
对象后,应该调用close()
方法来关闭它,以释放资源。然而,对于从System.in
读取数据的Scanner
对象,通常在程序结束前不需要手动关闭它,因为System.in
是由JVM管理的,并且会在程序退出时自动关闭。但是,为了养成良好的编程习惯,建议在不再需要Scanner
对象时调用close()
方法。 -
分隔符:
Scanner
类使用了一个分隔符(delimiter)来划分不同的数据项。默认情况下,Scanner
使用空白字符(如空格、制表符和换行符)作为分隔符,也可以使用useDelimiter()
方法来自定义分隔符。 -
换行符问题:在使用
next()
和nextLine()
方法时,需要注意换行符的处理。next()
方法不会消耗换行符,而nextLine()
会读取直到换行符。因此,在连续调用这两个方法时,可能需要调用一个额外的nextLine()
来消耗掉next()
留下的换行符。 -
使用hasNextXXX()方法:在尝试读取特定类型的输入之前,可以使用
hasNextInt()
、hasNextDouble()
等方法来检查输入流中是否还有下一个匹配类型的输入,这可以避免在输入不匹配时抛出异常。 -
异常处理:当输入的数据类型与预期不匹配时,
Scanner
的某些方法(如nextInt()
)会抛出InputMismatchException
异常。因此,建议使用try-catch块来捕获并处理这些异常。