Подтвердить что ты не робот

Почему InputStream # read() возвращает int, а не байт?

Почему InputStream#read() возвращает int, а не byte?

4b9b3361

Ответ 1

Потому что byte может удерживать только -128 до 127, тогда как он должен возвращать 0 до 255 (и -1, когда нет байта слева (то есть EOF)). Даже если он вернется byte, не будет места для представления EOF.

Более интересный вопрос заключается в том, почему он не возвращает short.

Ответ 2

Он возвращает int, потому что, когда поток больше не читается, он возвращает -1.

Если он возвращает байт, то -1 не может быть возвращен, чтобы указать ошибку, потому что -1 является допустимым байтом. Кроме того, вы не можете вернуть значение выше 127 или ниже -128, потому что Java обрабатывает только подписанные байты.

Много раз, когда вы читаете файл, вам нужны неподписанные байты для вашего кода обработки. Чтобы получить значения от 128 до 255, вы можете использовать короткий, но с помощью int вы будете более эффективно выравнивать регистры памяти с вашей шиной данных. В результате вы действительно не теряете какую-либо информацию, используя int, и вы, вероятно, получаете немного производительности. Единственным недостатком является стоимость памяти, но, скорее всего, вы не будете долго висеть на этом int (как вы ее обработаете и превратите в char или byte []).

Ответ 3

Таким образом, он может вернуть "-1". Он должен делать это, когда больше нет байтов для чтения.

Вы не можете заставить его возвращать байты иногда AND -1 для EOF/nobyte/whatever, поэтому он возвращает int;)

Ответ 4

Поскольку EOF (конец файла или вообще конец данных) не может быть представлен с помощью char.

Ответ 5

как говорит Java-документ в InputStream # read, Байт значения возвращается как int в диапазоне от 0 до 255. То есть значение байта [-128 ~ 127] было изменено на значение int [0 ~ 255], поэтому возвращаемое значение может использоваться для представления конца потока.

Ответ 6

Добавляем к ответ BalusC:

  • не a byte, чтобы разрешить [0; 255] в качестве основной емкости и дополнительного -1 в качестве результата EOF
  • int используется для настройки результата на машинное слово (одно из основных требований к операциям ввода-вывода - скорость, поэтому они должны работать как можно быстрее!)

Исключение не используется, потому что они значительно медленнее!