Почему StringReader.Read () не возвращает байт? - PullRequest
0 голосов
/ 15 ноября 2010

Я использовал StringReader в назначении структур данных (коды Хаффмана) и проверял, достигнут ли конец строки. Я обнаружил, что значение int, которое возвращает StringReader.read (), равно не -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

Ответы [ 5 ]

4 голосов
/ 15 ноября 2010

На самом деле это даже не компилируется.Я получаю:

Несоответствие типов: невозможно преобразовать из 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-битных символов Юникода.Они не помещаются в 8-битный байт.Можно утверждать, что char было бы достаточно, но тогда нет места для указания того, что EOF достигнут.

1 голос
/ 15 ноября 2010

Java String - это последовательность chars, которая является не байтами, а значениями, представляющими кодовые точки UTF-16. Семантика read заключается в возвращении следующего атома из входного потока. В случае StringReader атомарный компонент является 16-битным значением, которое не может быть представлено как один байт.

1 голос
/ 15 ноября 2010
 char c = (char) -1;
        System.out.println(""+c);
        System.out.println(""+(byte)c);

Этот код разрешит ваши сомнения ..

1 голос
/ 15 ноября 2010

Символы в java - 2 байта, потому что они закодированы в UTF-16. Вот почему read () возвращает int, потому что байт недостаточно велик.

1 голос
/ 15 ноября 2010

StringReader#read возвращает значение int, равное -1, если достигнут конец потока.

Проблема в вашем коде состоит в том, что вы уже преобразовали значение int вchar и протестируйте char:

System.out.println("Is it still (-1)?: " + (int) ((char) -1));
...