You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java Scanner的hasNext()方法问题:如何重置读取位置至文件开头?

问题解决:Scanner遍历文件后无法重置到开头的处理方案

首先明确:Scanner本身没有直接将输入流重置到文件开头的方法,它的reset()方法仅用于重置自身的配置(比如分隔符、匹配器状态),不会改变底层输入流的读取位置。而默认的文件输入流(如FileInputStream)不支持回退操作,所以遍历到文件末尾后,无法直接倒回开头。

以下是两种适合初学者的解决方案,均不使用ArrayList:

方案一:用支持mark/reset的输入流复用Scanner

通过BufferedInputStream包装文件输入流,它支持标记起始位置并重置回该位置,这样就能用同一个Scanner完成统计和读取操作。

import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.Scanner;

public class ReadIntsToArray {
    public static void main(String[] args) {
        try (BufferedInputStream bis = new BufferedInputStream(new FileInputStream("your-file.txt"));
             Scanner scanner = new Scanner(bis)) {
            
            // 标记输入流的起始位置,参数设为文件最大可能长度
            bis.mark(Integer.MAX_VALUE);
            
            // 第一次遍历统计整数数量
            int numCount = 0;
            while (scanner.hasNextInt()) {
                numCount++;
                scanner.nextInt(); // 必须读取整数,否则hasNextInt会一直返回true
            }
            
            // 重置输入流到标记的起始位置
            bis.reset();
            scanner.reset(); // 重置Scanner内部状态,清除之前的匹配缓存
            
            // 创建数组并读取数据
            int[] intArray = new int[numCount];
            for (int i = 0; i < numCount; i++) {
                intArray[i] = scanner.nextInt();
            }
            
            // 验证输出
            for (int num : intArray) {
                System.out.println(num);
            }
            
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

方案二:两次创建Scanner(更简单直观)

如果不介意新建Scanner对象,这种方法逻辑更清晰,适合初学者快速理解:先新建一个Scanner统计整数数量,关闭后再新建另一个Scanner读取内容到数组。

import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;

public class ReadIntsToArray {
    public static void main(String[] args) {
        File targetFile = new File("your-file.txt");
        int numCount = 0;
        
        // 第一步:统计整数数量
        try (Scanner countScanner = new Scanner(targetFile)) {
            while (countScanner.hasNextInt()) {
                numCount++;
                countScanner.nextInt();
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
            return;
        }
        
        // 第二步:读取整数到数组
        int[] intArray = new int[numCount];
        try (Scanner readScanner = new Scanner(targetFile)) {
            for (int i = 0; i < numCount; i++) {
                intArray[i] = readScanner.nextInt();
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
        
        // 验证输出
        for (int num : intArray) {
            System.out.println(num);
        }
    }
}

补充说明

为什么你调用Scanner.reset()没用?
Scanner的reset()方法只是将自身的分隔符、匹配模式等重置为默认值,不会操作底层输入流的位置。当输入流已经走到文件末尾时,即使调用该方法,Scanner也无法再读取到新内容。

内容的提问来源于stack exchange,提问作者CSP.AT.MASH

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 21:25:14