Java 读取无空格整数的文件–;hasNextInt()永远不会返回true

Java 读取无空格整数的文件–;hasNextInt()永远不会返回true,java,java.util.scanner,bufferedreader,filereader,java-io,Java,Java.util.scanner,Bufferedreader,Filereader,Java Io,我试图从一个文件中读取一个无空格的整数列表,但我不明白为什么我在while循环中从未通过该条件 这是整个“nums.txt”文件: 小脚本如下所示: import java.util.Scanner; import java.io.File; import java.io.BufferedReader; import java.io.FileReader; import java.io.FileNotFoundException; public class Test{ public sta

我试图从一个文件中读取一个无空格的整数列表,但我不明白为什么我在while循环中从未通过该条件

这是整个“nums.txt”文件:

小脚本如下所示:

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
}

像这样的东西应该适合你。确保对生成的每个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()

如果可以使用nextInt()方法将此扫描仪输入中的下一个标记解释为默认基数中的int值,则返回true

1212121212
是下一个标记,不能解释为int,因为最大int为2147483647

因此
hasnetint()
返回
false
,循环结束


扫描器
就其性质而言,可以处理由分隔符(默认情况下为空格)分割的令牌。如果您想一次使用一个字符,请根据其JavaDoc
Scanner.hasNextInt()
使用
Reader.read(),甚至使用
InputStream.read()

如果可以使用nextInt()方法将此扫描仪输入中的下一个标记解释为默认基数中的int值,则返回true

1212121212
是下一个标记,不能解释为int,因为最大int为2147483647

因此
hasnetint()
返回
false
,循环结束


扫描器
就其性质而言,可以处理由分隔符(默认情况下为空格)分割的令牌。如果您想一次使用一个字符,请使用
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);

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

  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);

你怎么知道一个数字何时结束,下一个数字何时开始?它们都只是个位数吗?如果是这种情况,请使用读取字符的方法,并将字符转换为int。这就是我所决定的,但它似乎太迟钝了,我想知道是否有更好的方法…我想这是一个比我所问的更具体的问题。谢谢你怎么知道一个数字何时结束,下一个数字何时开始?它们都只是个位数吗?如果是这种情况,请使用读取字符的方法,并将字符转换为int。这就是我所决定的,但它似乎太迟钝了,我想知道是否有更好的方法…我想这是一个比我所问的更具体的问题。谢谢很好的回答,但是用hasNextByte()和nextByte()替换hasNextInt()和nextByte(),并没有改变功能–程序仍然不输出任何内容并终止。抱歉,我犯了与您相同的错误,没有阅读文档
nextByte()
解析数字字符串的方式与
nextInteger()
完全相同。我已经编辑了。答案很好,但是用hasNextByte()和nextByte()替换hasNextInt()和nextByte(),并没有改变功能–程序仍然不输出任何内容并终止。抱歉--我犯了与您相同的错误,没有阅读文档
nextByte()
解析数字字符串的方式与
nextInteger()
完全相同。我编辑过。