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

コードを実行しようとしたところ、追加のエラーが 1 つ見つかりました。次のように、読み取る前に cur_byte を確認する必要があります。

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

そうしないと、 が得られEOFExceptionます。

java.lang.NumberFormatException: For input string: ""あなたのサンプル abc.txt では、例外はありません。

しかし、abc.txt に空の行を追加すると、遅かれ早かれこの例外が発生します。したがって、問題は abc.txt のどこかにある空の行にあります。

于 2013-06-20T07:10:53.460 に答える
0

実際には、ファイルの末尾またはファイルの先頭に空の文字列があるように見えます。

または、Integer を求める数値の 1 つ。

2 つの解決策があります。

  1. ファイルから読み取る各要素に対して、スペースと空の文字列のチェックを追加します。
  2. Integer を Long 値に変更します。
于 2013-06-20T07:23:39.593 に答える
0

s_LR に空の文字列が含まれているようです。

Windows スタイルの改行 (\r\n) があり、ランダム シークで '\r' をヒットすると、これが発生する可能性があると私が考えていることから。次に、char が s_LR に追加される前に、両方のループのブレーク条件が適用されます。

補足: あなたは Java の非常に特殊なコーディング スタイルを使用しています。あなたのプログラムには何の影響もありませんが、他の Java プログラマーにとっては読みにくく理解しにくいため、答えが得られない可能性があります。

于 2013-06-20T06:52:50.173 に答える