Scanner类

本文深入探讨了Java中Scanner类的功能和用法,包括其构造方法、常见方法如next()和nextLine()的工作原理,以及如何解析各种数据类型。同时,文章提供了详细的源码解析,帮助读者理解Scanner类内部的实现机制。
摘要由CSDN通过智能技术生成

Scanner类

介绍

A simple text scanner which can parse primitive types and strings using regular expressions.

一个简单的文本扫描器,可以使用正则表达式解析原始类型和字符串。

public final class Scanner
extends Object
implements Iterator<String>, Closeable

组成

构造方法摘要 
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() 
          如果此扫描器的输入中有另一个标记,则返回 trueboolean hasNext(Pattern pattern) 
          如果下一个完整标记与指定模式匹配,则返回 trueboolean hasNext(String pattern) 
          如果下一个标记与从指定字符串构造的模式匹配,则返回 trueboolean hasNextBigDecimal() 
          如果通过使用 nextBigDecimal() 方法,此扫描器输入信息中的下一个标记可以解释为默认基数中的一个 BigDecimal,则返回 trueboolean hasNextBigInteger() 
          如果通过使用 nextBigInteger() 方法,此扫描器输入信息中的下一个标记可以解释为默认基数中的一个 BigInteger 值,则返回 trueboolean hasNextBigInteger(int radix) 
          如果通过使用 nextBigInteger() 方法,此扫描器输入信息中的下一个标记可以解释为指定基数中的一个 BigInteger 值,则返回 trueboolean hasNextBoolean() 
          如果通过使用一个从字符串 "true|false" 创建的大小写敏感的模式,此扫描器输入信息中的下一个标记可以解释为一个布尔值,则返回 trueboolean hasNextByte() 
          如果通过使用 nextByte() 方法,此扫描器输入信息中的下一个标记可以解释为默认基数中的一个字节值,则返回 trueboolean hasNextByte(int radix) 
          如果通过使用 nextByte() 方法,此扫描器输入信息中的下一个标记可以解释为指定基数中的一个字节值,则返回 trueboolean hasNextDouble() 
          如果通过使用 nextDouble() 方法,此扫描器输入信息中的下一个标记可以解释为默认基数中的一个 double 值,则返回 trueboolean hasNextFloat() 
          如果通过使用 nextFloat() 方法,此扫描器输入信息中的下一个标记可以解释为默认基数中的一个 float 值,则返回 trueboolean hasNextInt() 
          如果通过使用 nextInt() 方法,此扫描器输入信息中的下一个标记可以解释为默认基数中的一个 int 值,则返回 trueboolean hasNextInt(int radix) 
          如果通过使用 nextInt() 方法,此扫描器输入信息中的下一个标记可以解释为指定基数中的一个 int 值,则返回 trueboolean hasNextLine() 
          如果在此扫描器的输入中存在另一行,则返回 trueboolean hasNextLong() 
          如果通过使用 nextLong() 方法,此扫描器输入信息中的下一个标记可以解释为默认基数中的一个 long 值,则返回 trueboolean hasNextLong(int radix) 
          如果通过使用 nextLong() 方法,此扫描器输入信息中的下一个标记可以解释为指定基数中的一个 long 值,则返回 trueboolean hasNextShort() 
          如果通过使用 nextShort() 方法,此扫描器输入信息中的下一个标记可以解释为默认基数中的一个 short 值,则返回 trueboolean 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() 
          将输入信息的下一个标记扫描为一个 bytebyte nextByte(int radix) 
          将输入信息的下一个标记扫描为一个 bytedouble nextDouble() 
          将输入信息的下一个标记扫描为一个 doublefloat nextFloat() 
          将输入信息的下一个标记扫描为一个 floatint nextInt() 
          将输入信息的下一个标记扫描为一个 intint nextInt(int radix) 
          将输入信息的下一个标记扫描为一个 int。 
 String nextLine() 
          此扫描器执行当前行,并返回跳过的输入信息。 
 long nextLong() 
          将输入信息的下一个标记扫描为一个 longlong nextLong(int radix) 
          将输入信息的下一个标记扫描为一个 longshort nextShort() 
          将输入信息的下一个标记扫描为一个 shortshort nextShort(int radix) 
          将输入信息的下一个标记扫描为一个 shortint 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) 
          将此扫描器的默认基数设置为指定基数。 

常用方法

next():只读取输入直到空格。它不能读两个由空格或符号隔开的单词。此外,next()在读取输入后将光标放在同一行中。(next()只读空格之前的数据,并且光标指向本行)

源码:

public String next() {
    //保证扫描器没有关闭
    ensureOpen();
    //清除所有正则规则和类型
    clearCaches();

    while (true) {
        //获取token
        String token = getCompleteTokenInBuffer(null);
        if (token != null) {
            matchValid = true;
            skipped = false;
            return token;
        }
        //如果需要输入则接受输入的参数,使用charBuffer接收输入的参数
        if (needInput)
            readInput();
        else
            throwFor();
    }
}
//保证扫描器没有关闭
private void ensureOpen() {
    if (closed)
        throw new IllegalStateException("Scanner closed");
}
//清除所有正则规则和类型
private void clearCaches() {
    hasNextPattern = null;
    typeCache = null;
}

nextLine():读取输入,包括单词之间的空格和除回车以外的所有符号(即。它读到行尾)。读取输入后,nextLine()将光标定位在下一行。

源码

public String nextLine() {
        if (hasNextPattern == linePattern())
            return getCachedResult();
        clearCaches();

        String result = findWithinHorizon(linePattern, 0);
        if (result == null)
            throw new NoSuchElementException("No line found");
        MatchResult mr = this.match();
        String lineSep = mr.group(1);
        if (lineSep != null)
            
            //使用substring直接截取
            result = result.substring(0, result.length() - lineSep.length());
        if (result == null)
            throw new NoSuchElementException();
        else
            return result;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值