Scanner 类 源码分析

Scanner 类

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

A Scanner分隔符模式将输入打破到令牌,默认情况下匹配空格。 然后可以使用各种next方法将得到的令牌转换成不同类型的值。

Scanner sc = new Scanner(System.in);
int i = sc.nextInt();
// System.in 是指系统输入通过键盘录入数据
//Sanner中的读取函数,不管是nextInt(),还是nextLine()都是采用正则匹配的方式读取的。
//nextLine()函数是返回从当前的缓冲位置,到换行符之间的字符串,即从缓冲区当前位置开始的一行。

Scanner 类 源码分析_第1张图片

通过构造方法可以查看能够通过很多方式进行扫描,可以通过输入流和文件进行实现。

常用方法

next()

public String next() {
    ensureOpen();
    clearCaches();
	//-读取数据至buf,匹配分隔模式,返回之间的内容
    while (true) {
        // 若准备工作完成,获取完整令牌
        String token = getCompleteTokenInBuffer(null);
        if (token != null) { // 匹配分隔模式,返回之间的内容
            matchValid = true;
            skipped = false;
            return token;
        }
        if (needInput)
            //从source中读取buf大小的数据
            readInput();
        else
            throwFor();
    }
}

hasNext()

public boolean hasNext() {
    ensureOpen(); // 判断scaner 是否完成构建
    saveState(); // 保存 sacner 的状态
    while (!sourceClosed) {  
        if (hasTokenInBuffer())
            return revertState(true); // 如果存在则设置状态为 true
        readInput();
    }
    boolean result = hasTokenInBuffer();
    return revertState(result);
}


private boolean hasTokenInBuffer() {
    matchValid = false;
    matcher.usePattern(delimPattern);
    matcher.region(position, buf.limit());
    // Skip delims first
    if (matcher.lookingAt())
        position = matcher.end();
    // If we are sitting at the end, no more tokens in buffer
    if (position == buf.limit())
        return false;
    return true;
}

以前只知道怎么用,现在学着知道他为什么怎么用

你可能感兴趣的:(JAVA)