【问题标题】:Java: Reading integers from a file into an arrayJava:将整数从文件读入数组
【发布时间】:2010-09-23 03:59:24
【问题描述】:
File fil = new File("Tall.txt");
FileReader inputFil = new FileReader(fil);
BufferedReader in = new BufferedReader(inputFil);

int [] tall = new int [100];

String s =in.readLine();

while(s!=null)
{
    int i = 0;
    tall[i] = Integer.parseInt(s); //this is line 19
    System.out.println(tall[i]);
    s = in.readLine();
}

in.close();

我正在尝试使用文件“Tall.txt”将其中包含的整数写入名为“tall”的数组中。它在某种程度上做到了这一点,但当我运行它时,它也会抛出以下异常(:

Exception in thread "main" java.lang.NumberFormatException: For input string: ""
    at java.lang.NumberFormatException.forInputString(Unknown Source)
    at java.lang.Integer.parseInt(Unknown Source)
    at java.lang.Integer.parseInt(Unknown Source)
    at BinarySok.main(BinarySok.java:19)

为什么它会这样做,我该如何删除它?如我所见,我将文件作为字符串读取,然后将其转换为整数,这并不违法。

【问题讨论】:

  • 顺便说一句,您应该在 while 循环之外声明“i”。如果不是,您将始终在数组的索引 0 处插入整数。
  • 顺便说一句,评论“这是第 19 行”是“Best comment ever seen”的候选者。您使用的是什么 IDE?
  • 我完全不知道它是如何到达那里的。我想我从某个地方获取了部分代码,显然 cmets 出现了。

标签: java arrays io


【解决方案1】:

您的文件中必须有一个空行。

您可能希望将 parseInt 调用包装在“try”块中:

try {
  tall[i++] = Integer.parseInt(s);
}
catch (NumberFormatException ex) {
  continue;
}

或者只是在解析前检查空字符串:

if (s.length() == 0) 
  continue;

请注意,通过在循环内初始化您的索引变量i,它始终为0。您应该将声明移到while 循环之前。 (或者让它成为for 循环的一部分。)

【讨论】:

  • 很可能是文件的最后一行。
【解决方案2】:

看起来 Java 正在尝试将空字符串转换为数字。数字系列的末尾有空行吗?

您可能可以像这样修复代码

String s = in.readLine();
int i = 0;

while (s != null) {
    // Skip empty lines.
    s = s.trim();
    if (s.length() == 0) {
        continue;
    }

    tall[i] = Integer.parseInt(s); // This is line 19.
    System.out.println(tall[i]);
    s = in.readLine();
    i++;
}

in.close();

【讨论】:

    【解决方案3】:

    您可能会混淆不同的行尾。 Windows 文件将以回车符和换行符结束每一行。 Unix 上的某些程序将读取该文件,就好像它在每行之间有一个额外的空白行,因为它会将回车视为行尾,然后将换行视为行的另一端。

    【讨论】:

    • 不,不管应用在什么平台上运行,BufferedReader 总是检查所有三种行分隔符:\r\n(回车+换行),\n(换行仅)和 \r(仅回车)。
    【解决方案4】:

    您可能想做这样的事情(如果您使用的是 java 5 及更高版本)

    Scanner scanner = new Scanner(new File("tall.txt"));
    int [] tall = new int [100];
    int i = 0;
    while(scanner.hasNextInt()){
       tall[i++] = scanner.nextInt();
    }
    

    【讨论】:

    • @Vanuan: java.util.ArrayList
    【解决方案5】:

    为了比较,这里是另一种读取文件的方法。它的一个优点是您不需要知道文件中有多少个整数。

    File file = new File("Tall.txt");
    byte[] bytes = new byte[(int) file.length()];
    FileInputStream fis = new FileInputStream(file);
    fis.read(bytes);
    fis.close();
    String[] valueStr = new String(bytes).trim().split("\\s+");
    int[] tall = new int[valueStr.length];
    for (int i = 0; i < valueStr.length; i++) 
        tall[i] = Integer.parseInt(valueStr[i]);
    System.out.println(Arrays.asList(tall));
    

    【讨论】:

      【解决方案6】:
      File file = new File("E:/Responsibility.txt");  
          Scanner scanner = new Scanner(file);
          List<Integer> integers = new ArrayList<>();
          while (scanner.hasNext()) {
              if (scanner.hasNextInt()) {
                  integers.add(scanner.nextInt());
              } else {
                  scanner.next();
              }
          }
          System.out.println(integers);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-09-22
        • 2021-12-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多