一、Scanner概览
- Scanner基本功能:可以实现键盘输入数据到程序中。是一个可以使用正则表达式来解析基本类型和字符串的简单文本扫描器。
Scanner
使用分隔符模式将其输入分解为标记,默认情况下该分隔符模式与空白匹配。然后可以使用不同的 next 方法将得到的标记转换为不同类型的值。- Scanner还可以使用不同于空白的分隔符。下面是从一个字符串读取若干项的例子:
String input = "1 fish 2 fish red fish blue fish";
Scanner s = new Scanner(input).useDelimiter("\\s*fish\\s*");
System.out.println(s.nextInt());
System.out.println(s.nextInt());
System.out.println(s.next());
System.out.println(s.next());
s.close();
/*output:
1
2
red
blue
*/
- 以下代码使用正则表达式同时解析所有的 4 个标记,并可以产生与上例相同的输出结果:
String input = "1 fish 2 fish red fish blue fish";
Scanner s = new Scanner(input);
s.findInLine("(\\d+) fish (\\d+) fish (\\w+) fish (\\w+)");
MatchResult result = s.match();
for (int i=1; i<=result.groupCount(); i++)
System.out.println(result.group(i));
s.close();
-
扫描器所使用的默认空白分隔符通过
Character
.isWhitespace
来识别。不管以前是否更改,reset()
方法将把扫描器分隔符的值重置为默认空白分隔符。 -
扫描操作可能被阻塞,而等待信息的输入。
-
next()
和hasNext()
方法及其基本类型 companion 方法(如nextInt()
和hasNextInt()
)首先跳过与分隔符模式匹配的输入,然后尝试返回下一个标记。在等待更多输入时 hasNext 和 next 方法都可能阻塞。hasNext 方法是否阻塞与其相关的 next 方法是否阻塞无关。 - 引用类型的一般步骤:
- 导包: import 包路径.类名称。 如果需要使用的目标类,和当前类位于同一个包下,则可以省略包语句不写。还有java.lang 包下的内容不需要导包,其他的包都要import语句。
- 创建:类名称 对象名 = new 类名称();
- 使用:对象名.成员方法名()
// 1.导包
import java.util.Scanner;
public class ScannerTest{
public static void main(String[] args){
// 2.创建
// 备注:System.in 代表从键盘进行输入
Scanner sc = new Scanner(System.in);
// 3.使用
// 获取键盘输入的一个int数字: int num = sc.nextInt();
// 获取键盘输入的一个字符串: int num = sc.next();
int num = sc.nextInt();
System.out.println(num);
}
}
findInLine(java.lang.String)
、findWithinHorizon(java.lang.String, int)
和skip(java.util.regex.Pattern)
方法的执行与分隔符模式无关。这些方法会尝试匹配与输入中的分隔符无关的指定模式,因此可用于分隔符无关的特殊环境中。在等待更多输入时这些方法可能阻塞。- 当某一扫描器抛出
InputMismatchException
时,该扫描器不会传递导致该异常的标记,因此可以通过其他某种方法来获取或跳过它。 - 对于某些类型的分隔模式,可能返回空标记。例如,"\\s+" 模式不会返回空标记,因为它与该分隔符的多个实例匹配。而分隔模式 "\\s" 可能返回空标记,因为它一次只传递一个空格。
- 扫描器可以从实现
Readable
接口的任何对象读取文本。如果对底层 readable 的Readable.read(java.nio.CharBuffer)
方法的调用抛出IOException
,则扫描器认为已经到达了输入的结尾。底层 readable 最新抛出的 IOException 可以通过ioException()
方法获取。 - 如果
Scanner
关闭,且其输入源实现Closeable
接口,则该输入源也将关闭。 - 若没有外部同步,则
Scanner
的多线程使用是不安全的。 - 除非另行说明,否则将一个
null
参数传递到Scanner
的任何一个方法中都将抛出NullPointerException
。 - 默认情况下扫描器会将数字解释为十进制形式,除非已经使用
useRadix(int)
方法设置了不同的基数。不管以前是否更改,reset()
方法将把扫描器的基数重置为10
。
二、Scanner常用方法
(一)构造方法
Scanner(File source) 构造一个新的 Scanner ,它生成的值是从指定文件扫描的。 |
Scanner(File source, String charsetName) 构造一个新的 Scanner ,它生成的值是从指定文件扫描的。 |
Scanner(InputStream source) 构造一个新的 Scanner ,它生成的值是从指定的输入流扫描的。 |
Scanner(InputStream source, String charsetName) 构造一个新的 Scanner ,它生成的值是从指定的输入流扫描的。 |
Scanner(Readable source) 构造一个新的 Scanner ,它生成的值是从指定源扫描的。 |
Scanner(ReadableByteChannel source) 构造一个新的 Scanner ,它生成的值是从指定信道扫描的。 |
Scanner(ReadableByteChannel source, String charsetName) 构造一个新的 Scanner ,它生成的值是从指定信道扫描的。 |
Scanner(String source) 构造一个新的 Scanner ,它生成的值是从指定字符串扫描的。 |
(二)常用方法
void | close() 关闭此扫描器。 |
Pattern | delimiter() 返回此 Scanner 当前正在用于匹配分隔符的 Pattern 。 |
String | findInLine(Pattern pattern) 试图在忽略分隔符的情况下查找下一个指定模式。 |
String | findInLine(String pattern) 试图在忽略分隔符的情况下查找下一个从指定字符串构造的模式。 |
String | findWithinHorizon(Pattern pattern, int horizon) 试图查找下一个指定模式。 |
String | findWithinHorizon(String pattern, int horizon) 试图在忽略分隔符的情况下查找下一个从指定字符串构造的模式。 |
boolean | hasNext() 如果此扫描器的输入中有另一个标记,则返回 true。 |
boolean | hasNext(Pattern pattern) 如果下一个完整标记与指定模式匹配,则返回 true。 |
boolean | hasNext(String pattern) 如果下一个标记与从指定字符串构造的模式匹配,则返回 true。 |
boolean | hasNextBigDecimal() 如果通过使用 nextBigDecimal() 方法,此扫描器输入信息中的下一个标记可以解释为默认基数中的一个 BigDecimal ,则返回 true。 |
boolean | hasNextBigInteger() 如果通过使用 nextBigInteger() 方法,此扫描器输入信息中的下一个标记可以解释为默认基数中的一个 BigInteger 值,则返回 true。 |
boolean | hasNextBigInteger(int radix) 如果通过使用 nextBigInteger() 方法,此扫描器输入信息中的下一个标记可以解释为指定基数中的一个 BigInteger 值,则返回 true。 |
boolean | hasNextBoolean() 如果通过使用一个从字符串 "true|false" 创建的大小写敏感的模式,此扫描器输入信息中的下一个标记可以解释为一个布尔值,则返回 true。 |
boolean | hasNextByte() 如果通过使用 nextByte() 方法,此扫描器输入信息中的下一个标记可以解释为默认基数中的一个字节值,则返回 true。 |
boolean | hasNextByte(int radix) 如果通过使用 nextByte() 方法,此扫描器输入信息中的下一个标记可以解释为指定基数中的一个字节值,则返回 true。 |
boolean | hasNextDouble() 如果通过使用 nextDouble() 方法,此扫描器输入信息中的下一个标记可以解释为默认基数中的一个 double 值,则返回 true。 |
boolean | hasNextFloat() 如果通过使用 nextFloat() 方法,此扫描器输入信息中的下一个标记可以解释为默认基数中的一个 float 值,则返回 true。 |
boolean | hasNextInt() 如果通过使用 nextInt() 方法,此扫描器输入信息中的下一个标记可以解释为默认基数中的一个 int 值,则返回 true。 |
boolean | hasNextInt(int radix) 如果通过使用 nextInt() 方法,此扫描器输入信息中的下一个标记可以解释为指定基数中的一个 int 值,则返回 true。 |
boolean | hasNextLine() 如果在此扫描器的输入中存在另一行,则返回 true。 |
boolean | hasNextLong() 如果通过使用 nextLong() 方法,此扫描器输入信息中的下一个标记可以解释为默认基数中的一个 long 值,则返回 true。 |
boolean | hasNextLong(int radix) 如果通过使用 nextLong() 方法,此扫描器输入信息中的下一个标记可以解释为指定基数中的一个 long 值,则返回 true。 |
boolean | hasNextShort() 如果通过使用 nextShort() 方法,此扫描器输入信息中的下一个标记可以解释为默认基数中的一个 short 值,则返回 true。 |
boolean | hasNextShort(int radix) 如果通过使用 nextShort() 方法,此扫描器输入信息中的下一个标记可以解释为指定基数中的一个 short 值,则返回 true。 |
IOException | ioException() 返回此 Scanner 的底层 Readable 最后抛出的 IOException 。 |
Locale | locale() 返回此扫描器的语言环境。 |
MatchResult | match() 返回此扫描器所执行的最后扫描操作的匹配结果。 |
String | next() 查找并返回来自此扫描器的下一个完整标记。 |
String | next(Pattern pattern) 如果下一个标记与指定模式匹配,则返回下一个标记。 |
String | next(String pattern) 如果下一个标记与从指定字符串构造的模式匹配,则返回下一个标记。 |
BigDecimal | nextBigDecimal() 将输入信息的下一个标记扫描为一个 BigDecimal 。 |
BigInteger | nextBigInteger() 将输入信息的下一个标记扫描为一个 BigInteger 。 |
BigInteger | nextBigInteger(int radix) 将输入信息的下一个标记扫描为一个 BigInteger 。 |
boolean | nextBoolean() 扫描解释为一个布尔值的输入标记并返回该值。 |
byte | nextByte() 将输入信息的下一个标记扫描为一个 byte。 |
byte | nextByte(int radix) 将输入信息的下一个标记扫描为一个 byte。 |
double | nextDouble() 将输入信息的下一个标记扫描为一个 double。 |
float | nextFloat() 将输入信息的下一个标记扫描为一个 float。 |
int | nextInt() 将输入信息的下一个标记扫描为一个 int。 |
int | nextInt(int radix) 将输入信息的下一个标记扫描为一个 int。 |
String | nextLine() 此扫描器执行当前行,并返回跳过的输入信息。 |
long | nextLong() 将输入信息的下一个标记扫描为一个 long。 |
long | nextLong(int radix) 将输入信息的下一个标记扫描为一个 long。 |
short | nextShort() 将输入信息的下一个标记扫描为一个 short。 |
short | nextShort(int radix) 将输入信息的下一个标记扫描为一个 short。 |
int | radix() 返回此扫描器的默认基数。 |
void | remove() Iterator 的这种实现不支持移除操作。 |
Scanner | reset() 重置此扫描器。 |
Scanner | skip(Pattern pattern) 在忽略分隔符的情况下跳过与指定模式匹配的输入信息。 |
Scanner | skip(String pattern) 跳过与从指定字符串构造的模式匹配的输入信息。 |
String | toString() 返回此 Scanner 的字符串表示形式。 |
Scanner | useDelimiter(Pattern pattern) 将此扫描器的分隔模式设置为指定模式。 |
Scanner | useDelimiter(String pattern) 将此扫描器的分隔模式设置为从指定 String 构造的模式。 |
Scanner | useLocale(Locale locale) 将此扫描器的语言环境设置为指定的语言环境。 |
Scanner | useRadix(int radix) 将此扫描器的默认基数设置为指定基数。 |