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
相关产品推荐
相关产品推荐

