Scanner
# Scanner
前面我们简单用了 java.util.Scanner
类,从控制台读取字符串和基本类型数值。例如,为了能从键盘读取,为 System.in
创建了一个 Scanner:
Scanner input = new Scanner(System.in);
int x = input.nextInt();
2
我们也可以使用 Scanner,从文件中读取数据:
Scanner input = new Scanner(new File(filename));
# Scanner 的常用方法
常用方法如下:
+Scanner(source: File) :创建一个Scanner,从指定的文件中扫描标记
+Scanner(source: String) :创建一个Scanner,从指定的字符串中扫描标记
+close() :关闭该Scanner
+hasNext(): boolean 如果Scanner还有更多数据读取,则返回true
+next(): String 从该Scanner中读取下一个标记作为字符串返回
+nextLine(): String 从该Scanner中读取一行,以换行结束
+nextByte(): byte 从该Scanner中读取下一个标记作为byte值返回
+nextShort(): short 从该Scanner中读取下一个标记作为short值返回
+nextInt(): int 从该Scanner中读取下一个标记作为int值返回
+nextLone(): long 从该Scanner中读取下一个标记作为long值返回
+nextFloat(): float 从该Scanner中读取下一个标记作为float值返回
+nextDouble(): double 从该Scanner中读取下一个标记作为double值返回
+useDelimiter(pattern: String): Scanner 设置改Scanner的分割符,并且返回该Scanner
2
3
4
5
6
7
8
9
10
11
12
13
# 实例
下面的例子创建了一个 Scanner 的实例,并从文件 scores.txt 中读取数据。其中 scores.txt 里的内容是上一节 PrintWriter 写入的:
import java.util.Scanner;
public class ReadData {
public static void main(String[] args) throws Exception {
// Create a File instance
java.io.File file = new java.io.File("scores.txt");
// Create a Scanner for the file
Scanner input = new Scanner(file);
// Read data from a file
while (input.hasNext()) {
String firstName = input.next();
String mi = input.next();
String lastName = input.next();
int score = input.nextInt();
System.out.println(
firstName + " " + mi + " " + lastName + " " + score);
}
// Close the file
input.close();
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# 为 String 创建 Scanner
可以使用 Scanner 类从文件或者键盘读取数据。也可以使用 Scanner 类从一个字符串扫描数据。例如,下面代码
Scanner input = new Scanner("13 14");
int sum = input.nextlnt() + input.nextlnt(); //27
System.out.println("Sum is " + sum);
2
3
运行结果:Sum is 27
# Scanner 的工作原理
方法 nextByte()
、nextShort()
、nextlnt()
、 nextLong()
、nextFloat()
、nextDouble()
和 next()
等都称为标记读取方法( token-reading method),因为它们会读取用分隔符分隔开的标记。默认情况下,分隔符是空格。可以使用 useDelimiter(String regex)
方法设置新的分隔符模式。
一个输入方法是如何工作的呢?一个标记读取方法首先跳过任意分隔符(默认情况下是空格),然后读取一个以分隔符结束的标记。然后,对应于 nextByte()
、nextShort()
、nextlnt()
、 nextLong()
、nextFloat()
和 nextDouble()
这个标记就分别被自动地转换为 1 个 byte
, short
、int
、long
、float
或 double
型的值。对于 next()
方法而言是无须做转换的。如果标记和期望的类型不匹配,就会抛出一个运行异常 java.util.InputMismatchException()
方法 next()
和 nextLine()
都会读取一个字符串。next()
方法读取一个由分隔符分隔的字符串,但是 nextLine()
读取一个以换行符结束的行。
注意:行分隔符字符串是由系统定义的,在 Windows 平台上\r\n, 而在 UNIX 平台上是 \n。为了得到特定平台上的行分隔符,使用
String lineSeparator = System.getProperty("line.separator");
如果从键盘输入,每行就以回车键(Enter key) 结束,它对应于\n 字符。
标记读取方法不能读取标记后面的分隔符。如果在标记读取方法之后调用 nextLine(),该方法读取从这个分隔符开始,到这行的行分隔符结束的字符。这个行分隔符也被读取,但是它不是 nextLine() 返回的字符串部分
假设一个名为 test.txt 的文本文件包含一行
34 567
在执行完下面的代码之后,intValue 的值为 34, 而 line 包含的字符是' ', '5', '6', '7'
Scanner input = new Scanner(new File(test.txt));
int intValue = input.nextInt();
String line = input.nextLine();
2
3
如果从键盘键入,那会发生什么呢?假设为下面的代码输入 34, 然后按回车键,接着输入 567 然后再按回车键:将会得到 intValue 值是 34, 而 line 中是一个空的宇符串。这是为什么呢?标记读取方法 nextlnt()
读取 34, 然后在分隔符处停止,这里的分隔符是行分隔符(回车键)。nextLine()
方法会在读取行分隔符之后结束,然后返回在行分隔符之前的字符串。因为在行分隔符之前没有字符,所以 line 是空的。
Scanner input = new Scanner(System.in);
int intValue = input.nextInt();
String line = input.nextLine();
2
3