0

データ構造の割り当て (ハフマン コード) で StringReader を使用していて、文字列の末尾に到達したかどうかをテストしていました。StringReader.read() が返す int 値は -1 ではなく 65535 であることがわかったので、結果をバイトにキャストすると、私が抱えていた無限ループの問題が解決しました。

これは JDK のバグですか、それとも Reader.read() 呼び出しから返された値をバイトにキャストするのが一般的な方法ですか? または、何か不足していますか?

私のコードの要点は次のようなものでした:

StringReader sr = new StringReader("This is a test string");
char c;
do {
    c = sr.read();
//} while (c != -1);     //<--Broken
} while ((byte)c != -1); //<--Works
4

5 に答える 5

4

実際、それはコンパイルすらしません。私は得る:

タイプの不一致:intからcharに変換できません

sr.read()呼び出しが返されるので、そのようintに保存することをお勧めします。

これはコンパイルされます(そして期待どおりに機能します):

StringReader sr = new StringReader("This is a test string");
int i;               // <-- changed from char
do {
    i = sr.read();

    // ... and if you need a char...
    char c = (char) i;

} while (i != -1);   // <-- works :-)

StringReader.Read()がバイトを返さないのはなぜですか?

文字列は16ビットのUnicode文字で構成されています。これらは8ビットバイトには収まりません。aで十分だったと主張することもできcharますが、EOFに到達したことを示す余地はありません。

于 2010-11-15T09:17:35.577 に答える
1

StringReader#readストリームの終わりに達した場合のint値を返します。-1

コードの問題は、すでに値をcharに変換intし、charをテストしていることです。

System.out.println("Is it still (-1)?: " + (int) ((char) -1));
于 2010-11-15T09:15:46.060 に答える
1

Javaの文字は、UTF-16でエンコードされているため、2バイトです。バイトが十分に大きくないため、read()がintを返すのはこのためです。

于 2010-11-15T09:16:35.153 に答える
1
 char c = (char) -1;
        System.out.println(""+c);
        System.out.println(""+(byte)c);

このコードはあなたの疑問を解決します..

于 2010-11-15T09:18:06.280 に答える
1

Javaは、バイトではなく、UTF-16コードポイントを表す値Stringのシーケンスです。charsのセマンティクスは、入力ストリームから次のアトムreadを返すことです。アトミックコンポーネントの場合、16ビット値であり、1バイトとして表すことはできません。StringReader

于 2010-11-15T09:18:32.293 に答える