NumberFormatException的同时,从一个大的文件选择随机元素(NumberForma

2019-10-28 14:10发布

我有一个非常大的文件,其中包含这样的用户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();
    }
}

有没有在我上面的代码中的任何问题吗?

Answer 1:

我试图运行你的代码,发现一个额外的错误 - 你必须检查cur_byte之前,内容如下:

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

否则,你会得到EOFException

与样品的abc.txt我不明白java.lang.NumberFormatException: For input string: ""异常。

但是,如果我在的abc.txt加空线I早晚得此异常。 因此,问题是由空行中的abc.txt地方。



Answer 2:

任何不可分析的字符串,如果你传递给parseInt方法,然后将筹集NumberFormatException 。 像空字符串,也Integer可以容纳的最大和最小值int可以有,2147483647-2147483648。 如果值超出的那则提高NumberFormatException

If the string does not contain a parsable integer. ([Documentation][1])


Answer 3:

看来,s_LR包含一个空字符串。

从什么我搞清楚,如果你有windows风格的换行符(\ r \ n)和点击“\ r”与随机寻求这可能发生。 然后,在两个循环盈亏条件将适用,之前的任何字符被添加到s_LR。

旁注:您使用的是非常典型的编码风格的Java。 虽然对你的PROGRAMM没有影响,这是很难读/了解其他Java程序员,因此你可能无法得到答案。



Answer 4:

真的是像你必须在文件的末尾或者在文件的开头空字符串。

数字长整数或一个。

我看到两个解决方案:

  1. 添加检查空间并为您从文件中读取每个元素空字符串。
  2. 更改整型龙价值。


文章来源: NumberFormatException while selecting random elements from a big file