读取无间隔整数的文件 – hasNextInt() never returns true

Reading file of unspaced integers – hasNextInt() never returns true

我正在尝试从一个文件中读取一个无间隔整数列表,但我不明白为什么我在我的 while 循环中从来没有通过条件。

这是整个 "nums.txt" 文件:

12121212121212121212121212121212
00001212121212121212121212121212
33331212121212121212121212121212

小脚本如下所示:

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

public class Test{
  public static void main(String[] args){
    try{
      Scanner reader = new Scanner(new BufferedReader(new FileReader(new File("nums.txt"))));
      while(reader.hasNextInt()){
        System.out.println(reader.nextInt());
      }
     reader.close()
    }
    catch(FileNotFoundException e){
        e.printStackTrace();
    }
  }
}

当运行时,这什么都不输出,并终止。

像这样的东西应该适合你。确保对生成的每个 int 做一些事情,否则你会失去它。

BufferedReaderreader = new new BufferedReader(new FileReader(new File("nums.txt")));

while ((currentChar = br.read()) != null) {
    // discard white space
    if (!java.lang.Character.isWhitespace(currentChar))
            int x = Integer.parseInt(currentChar)
            // do something with the int
}

根据其 JavaDoc Scanner.hasNextInt():

Returns true if the next token in this scanner's input can be interpreted as an int value in the default radix using the nextInt() method.

12121212121212121212121212121212是下一个token,不能解释为int,因为int最大为2147483647。

因此 hasNextInt() returns false,循环结束。

A Scanner 本质上适用于由分隔符分隔的标记(默认情况下,space)。如果您想一次使用一个字符,请使用 Reader.read() 甚至 InputStream.read().

此问题的实用解决方案,通过读取字符并返回文件中的值:

  BufferedReader reader = new BufferedReader(new FileReader(new File("nums.txt")));
    while(reader.read()%48 != -1){
      System.out.println(reader.read()%48);
    }

由于文件可能包含换行符和其他字符,因此需要进行额外的解析以在返回时仅接受所需的数字。

或使用扫描仪:

  Scanner reader = new Scanner(new File("nums.txt"));
    while(reader.hasNextLine())
    for (String token : reader.nextLine().split("(?!^)"))
        System.out.println(token);