1

私のコンピューターには、Java プログラムから読み取っているテキスト ファイルがあり、いくつかの条件を作成したいと考えています。ここに私のメモ帳ファイルがあります:

   #Students
   #studentId   studentkey  yearLevel   studentName token   
   358314           432731243   12          Adrian      Afg56       
   358297           432730131   12          Armstrong   YUY89       
   358341           432737489   12          Atkins      JK671   

        #Teachers
        #teacherId  teacherkey    yearLevel teacherName token   
        358314          432731243   12          Adrian      N7ACD       
        358297          432730131   12          Armstrong   EY2C        
        358341          432737489   12          Atkins      F4NGH

以下のコードを使用してメモ帳からこれを読んでいると、Array out of bound 例外が発生します。デバッグ中に、strLine.length() の "  #Students" 値を取得します。誰でもこれを解決するのを助けることができますか?

private static Integer STUDENT_ID_COLUMN = 0;
private static Integer STUDENT_KEY_COLUMN = 1;
private static Integer YEAR_LEVEL_COLUMN = 2;
private static Integer STUDENT_NAME_COLUMN = 3;
private static Integer TOKEN_COLUMN = 4;

public static void main(String[] args) {
    ArrayList<String> studentTokens = new ArrayList<String>();

    try {
        // Open the file that is the first
        // command line parameter
        FileInputStream fstream = new FileInputStream("test.txt");
        BufferedReader br = new BufferedReader(new InputStreamReader(fstream));
        String strLine;
        // Read File Line By Line
        while ((strLine = br.readLine()) != null) {
            strLine = strLine.trim();

            if ((strLine.length()!=0) && (strLine.charAt(0)!='#')) {
                String[] students = strLine.split("\\s+");
                studentTokens.add(students[TOKEN_COLUMN]);
            }


        }

        for (String s : studentTokens) {
            System.out.println(s);
        }

        // Close the input stream
        in.close();
    } catch (Exception e) {// Catch exception if any
        System.err.println("Error: " + e.getMessage());
    }
}
4

4 に答える 4

1

あなたが提供した情報は不正確です。

以下のコードを使用してメモ帳からこれを読んでいると、Array out of bound 例外が発生します。

コードと入力があなたが述べたとおりである場合、これがどのように可能かわかりません。私が見ることができる唯一の場所ArrayIndexOutOfBoundsExceptionは、次の行です。

  students[TOKEN_COLUMN]

しかし、あなたのコードと入力を読んだところ、そこまで到達するすべての入力行には 5 つのフィールドがあることがわかりました。分割すると、5 つの要素を持つ配列が得られ、機能しstudents[TOKEN_COLUMN]ます。

IMO、プログラムまたは入力は、あなたが説明したとおりではありません。(私の推測では、フィールドが 5 つ未満の入力行があると思います。)

デバッグ中に、 の「  #Students」値を取得しstrLine.length()ます。

それは信じられないほど奇妙です。 strLine.length()を返しますint。あなたが私たちに見せているのは文字列です。


実際、私は何が起こっているのかについての予感を持っています。が(not !!)"  #Students"の値である場合、何らかの方法でファイルの先頭にガベージを取得することができました。コードでこれを調べると、最初の文字「#」ではなく、行には 5 つではなく 2 つのフィールドがあるように見えます。これにより、例外が発生します ...strLinestrLine.length()

そして、そのゴミがどこから来るのか知っていると思います。ファイルをUTF-8として保存したため、メモ帳によってファイルの先頭に挿入されたのはUTF-8バイトオーダーマーカーです。次に、ファイルはCP1252 を使用して読み取られました...これは(おそらく)システムのデフォルトの文字セットです

教訓: メモ帳は使わない。本物のエディタを使用してください。

参照: https://en.wikipedia.org/wiki/Byte_order_mark#Representations_of_byte_order_marks_by_encoding

于 2013-07-11T09:30:04.907 に答える
1

エンコードの問題に直面しているようです。ファイルを同じ形式で保存して読み取ります。できれば UTF-8 を使用してください。読み取りにはコンストラクターを使用しnew FileInputStream(<fileDir>, "UTF8")ます。
ファイルをユニコードで保存する方法

于 2013-07-11T08:20:34.673 に答える
1

おそらくファイルはUnicodeであると考えられますが、ASCIIを求めていますか? ここで変更できます:

BufferedReader br = new BufferedReader(new InputStreamReader(in, charakterset));

これが役立つ可能性があります: Java InputStream エンコーディング/文字セット

于 2013-07-11T08:16:42.890 に答える