2

ファイルの文字を文字ごとに読み込もうとしています。残念ながら、Javaはファイルから文字を読み取るときにEOFを無視します。

FileReader fileReader = new FileReader(fileText);
char c;
String word = "";
List<String> words = new ArrayList<String>();

while ((c = (char) fileReader.read()) != -1) {
    System.out.println(c);
    if (c != ' ') {
        word = word + c;
    }
    else {
        words.add(word + " ");
        word = "";
    }
}

ファイルが読み取られた後に分割されるはずですが、代わりに実行が停止することはありません。

4

3 に答える 3

8

Javaでは、charは符号なしであり、に等しくすることはできません-1。キャストを行う前に比較を行う必要があります。

int ch;
while ((ch = fileReader.read()) != -1) {
    char c = (char)ch;
    System.out.println(c);
    ...
}
于 2012-12-11T17:55:51.137 に答える
4

これは、割り当てたとしても、charに等しくできないために発生します。-1-1

char c = (char)-1;
System.out.println(c == -1); // prints false

を作成cし、連結する場合intにのみキャストします。char

word = word + (char)c;

さらに良いことStringBuilderに、実行時に文字列を作成するために使用します。そうしないと、ループ内に多くの一時的な文字列オブジェクトが作成され、これらのオブジェクトは破棄されます。

StringBuilder word = new StringBuilder();
List<String> words = new ArrayList<String>();
int c;
while ((c = fileReader.read()) != -1) {
    System.out.println((char)c);
    word.append((char)c);
    if (c == ' ') {
        words.add(word.toString());
        word = new StringBuilder();
    }
}
于 2012-12-11T17:56:08.797 に答える
2

以下のコードを試してください

public static void main(String[] args) throws IOException {
    FileReader fileReader = new FileReader(fileLocation);
    int c;
    String word = "";
    List<String> words = new ArrayList<String>();

    while ((c = (int) fileReader.read()) != -1) {
        System.out.println((char)c);
        char ch = (char)c;
        if (ch != ' ') {
            word = word + ch;
        } else {
            words.add(word + " ");
            word = "";
        }
    }
    System.out.println(word);
}
于 2012-12-11T18:00:08.897 に答える