0

我有一个非常大的文件,其中包含这样的用户 ID。该大文件中的每一行都是一个用户 ID。

149905320
1165665384
66969324
886633368
1145241312
286585320
1008665352

所以在那个大文件中,我将拥有大约 3000 万个用户 ID。现在我正在尝试从那个大文件中选择随机用户 ID。下面是我拥有的程序,但在某些时候它总是给我这样的异常——我不确定为什么会发生这种异常。

Exception in thread "main" java.lang.NumberFormatException: For input string: ""
    at java.lang.NumberFormatException.forInputString(NumberFormatException.java:59)
    at java.lang.Integer.parseInt(Integer.java:481)
    at java.lang.Integer.parseInt(Integer.java:510)
    at com.host.bulls.service.lnp.RandomReadFromFile.main(RandomReadFromFile.java:65)

以下是我的程序 -

public static void main(String[] args) throws Exception {

    File f = new File("D:/abc.txt");
    RandomAccessFile file;

    try {

        file = new RandomAccessFile(f, "r");
        long file_size = file.length();

        // Let's start
        long chosen_byte = (long)(Math.random() * (file_size - 1));
        long cur_byte = chosen_byte;

        // Goto starting position
        file.seek(cur_byte);

        String s_LR = "";
        char a_char;

        // Get left hand chars
        for (;;)
        {
            a_char = (char)file.readByte();
            if (cur_byte < 0 || a_char == '\n' || a_char == '\r' || a_char == -1) break;
            else 
            {
                s_LR = a_char + s_LR;
                --cur_byte;
                if (cur_byte >= 0) file.seek(cur_byte);
                else break;
            }
        }

        // Get right hand chars
        cur_byte = chosen_byte + 1;
        file.seek(cur_byte);
        for (;;)
        {
            a_char = (char)file.readByte();
            if (cur_byte >= file_size || a_char == '\n' || a_char == '\r' || a_char == -1) break;
            else 
            {
                s_LR += a_char;
                ++cur_byte;
            }
        }

        // Parse ID
        if (cur_byte < file_size) 
        {
            int chosen_id = Integer.parseInt(s_LR);
            System.out.println("Chosen id : " + chosen_id);
        }
        else
        {
            throw new Exception("Ran out of bounds..");
        }

    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

我上面的代码有什么问题吗?

4

4 回答 4

1

我尝试运行您的代码并发现另一个错误 - 您必须在阅读之前检查 cur_byte,如下所示:

if (cur_byte < file_size) {
    a_char = (char) file.readByte();
}

否则你会得到EOFException.

使用您的示例 abc.txt 我没有java.lang.NumberFormatException: For input string: ""例外。

但是如果我在 abc.txt 中添加空行,我迟早会得到这个异常。因此,问题在于 abc.txt 中某处的空行。

于 2013-06-20T07:10:53.460 回答
0

如果传递给parseInt方法,任何不可解析的字符串都会引发NumberFormatException。像空字符串一样,也Integer可以保存 int 可以具有的最大值和最小值,2147483647-2147483648。如果价值超出了这个范围,那么它就会提高NumberFormatException

If the string does not contain a parsable integer. ([Documentation][1])
于 2013-06-20T06:47:59.463 回答
0

似乎 s_LR 包含一个空字符串。

从我的推测来看,如果您有 Windows 样式的换行符 (\r\n) 并通过随机搜索点击“\r”,这可能会发生。然后在将任何字符添加到 s_LR 之前,将应用两个循环中的中断条件。

旁注:您正在使用一种非常非典型的 java 编码风格。虽然它对您的程序没有影响,但其他 Java 程序员更难阅读/理解,因此您可能无法得到答案。

于 2013-06-20T06:52:50.173 回答
0

真的,看起来你在文件末尾或文件开头有空字符串。

或需要整数的数字之一。

我看到两个解决方案:

  1. 为您从文件中读取的每个元素添加空格和空字符串检查。
  2. 将 Integer 更改为 Long 值。
于 2013-06-20T07:23:39.593 回答