我有一个非常大的文件,其中包含这样的用户ID。该大文件中的每一行都是用户ID。
149905320
1165665384
66969324
886633368
1145241312
286585320
1008665352
因此,在那个大文件中,我将拥有大约30万个用户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();
}
}
我上面的代码有问题吗?
答案 0 :(得分: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中的空行。
答案 1 :(得分:0)
任何不可解析的字符串如果您传递给parseInt
方法,那么它将引发NumberFormatException
。像空字符串一样,Integer
也可以保持最大和最小值。 int可以具有的最小值, 2147483647 或 -2147483648 。如果价值超出该值,则会提高NumberFormatException
If the string does not contain a parsable integer. ([Documentation][1])
答案 2 :(得分:0)
似乎s_LR包含一个空字符串。
从我的想法来看,如果你有windows风格的换行符(\ r \ n)并且使用随机搜索命中'\ _ \',就会发生这种情况。然后,在将任何char添加到s_LR之前,将应用两个循环中的break-conditions。
旁注:你正在使用非常非典型的java编码风格。虽然它对你的程序没有影响,但对于其他java程序员来说,阅读/理解起来比较困难,因此你可能得不到答案。
答案 3 :(得分:0)
真的看起来你在文件的末尾或文件的开头有空字符串。
或者其中一个代表Integer的数字。
我看到两个解决方案: