【问题标题】:Reading file of unspaced integers – hasNextInt() never returns true读取无间距整数文件 – hasNextInt() 永远不会返回 true
【发布时间】:2017-10-09 10:01:40
【问题描述】:

我正在尝试从文件中读取未加空格的整数列表,但我无法弄清楚为什么我在 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。
  • 这就是我所决定的,但它似乎很迟钝,我想知道是否有更好的方法......我想这是一个比我问的更具体的问题。谢谢!

标签: java java.util.scanner bufferedreader filereader java-io


【解决方案1】:

这样的东西应该适合你。一定要对生成的每个 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
}

【讨论】:

    【解决方案2】:

    根据其JavaDoc Scanner.hasNextInt():

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

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

    因此hasNextInt() 返回false,您的循环结束。

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

    【讨论】:

    • 很好的答案,但是用 hasNextByte() 和 nextByte() 代替 hasNextInt() 和 nextInt(),不会改变功能 - 程序仍然不输出任何内容并终止。
    • 道歉——我犯了同样的错误,你没有阅读文档。 nextByte() 解析数字字符串的方式与 nextInteger() 完全相同。我已经编辑了。
    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多