1

現在、興味深い問題が発生しています。

私はこのファイルを読み込もうとしています。このファイルには、最も一般的な1000の英語の単語がアルファベット順に含まれています。

http://www.file-upload.net/download-6679295/basicVocabulary.txt.html

これは、ファイルの先頭にあるスニペットです。

a
able
about
above
according
account
across
act
action
added
afraid
after

今の私の問題は、txtファイルを正しく読んでいるように見えますが、結果セット/結果リストの最初の行が後で欠落していることです。この場合、これは文字「a」です。これは、最初の位置にあるためです。

私の問題を再現できるようにするには、上記のtxtファイルを使用してこのサンプルコードを試してみてください(ファイルパスを更新することを忘れないでください)。コメントで私に来るコンソール出力を追加しました。

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;

public class MyWrongBehaviour {

public static void main(String[] args){
    MyWrongBehaviour wrong = new MyWrongBehaviour(); 

    List<String> list = wrong.loadLanguageFile(); 

    System.out.println("size of the list: " + list.size()); //Answer is 1000, that's the correct size

    for(String s : list){
        System.out.println(s); // "a" will appear, so it is somehow included
    }

    if(list.contains("a")){
        System.out.println("found \"a\""); // doesn't get written on the console, can't find it
    }

    for(String s : list){
        if(s.equals("a")){
            System.out.println("found \"a\""); // never gets written, can't find it
        }
    }


}

private List<String> loadLanguageFile() {
    List<String> result = null;
    try (InputStream vocIn = getClass().getResourceAsStream(
            "/test/basicVocabulary.txt")) {

        if (vocIn == null) {
            throw new IllegalStateException(
                    "InputStream for the basic vocabulary must not be null");
        }

        BufferedReader in = new BufferedReader(new InputStreamReader(vocIn,
                "UTF-8"));

        String zeile = null;

        result = new ArrayList<>();
        while ((zeile = in.readLine()) != null) {
            result.add(zeile.trim());
        }
    } catch (IOException e) {
        e.printStackTrace();
    }

    return result;
}


}

なぜこれが起こっているのか、そしてそれを修正するために私が何ができるのか誰かが考えていますか?ファイルをUTF-8として保存したのに、文字セットエラーが発生する可能性があるか、ファイルを破損する非表示の文字があるのではないかと思いますが、それを特定する方法がわかりません。

ところで:私は以前にハッシュセットを使用しましたが、セットでは最初の行も追加されませんでした。現在は追加されていますが、見つかりません。

すべての回答に感謝し、あなたが私と共有していると思いました。

4

1 に答える 1

9

ファイルは、UTF-8 であることを示すバイト オーダー マークで始まるため、最初の行は実際には "\ufeffa" (つまり、U+FEFF と 'a' の 2 文字) に相当しますが、これは等しくありません。 「あ」に。

これを取り除く1つの方法は、次を使用することです:

result.add(zeile.trim().replace("\ufeff", ""));

その変更後、コードは期待どおりに機能します。Javaでバイトオーダーマークを削除するより良い方法があるかもしれませんが、私はそれを直接知りません。

于 2012-10-10T13:35:50.283 に答える