2009-09-10 2 views

ответ

9

На самом деле я немного работал с байтами в последнее время, и они могут раздражать. Они повышают конвертацию в ints при малейшей провокации, и нет никакого указания на то, чтобы превратить число в байт - например, 8l даст вам длинное значение 8, но для байта вы должны сказать (байт) 8

Кроме того, они будут (в значительной степени) всегда храниться внутренне как ints, если вы не используете массив (и, возможно, даже тогда .. не уверены).

Я думаю, что они просто считают, что единственной причиной использования байта является i/o, где вам действительно нужны 8 бит, но внутренне они ожидают, что вы всегда будете использовать ints.

Кстати, байты могут выполнять хуже, так как он всегда должен быть в масках ...

По крайней мере, я помню, как читал, что много лет назад, могли бы изменить сейчас.

В качестве примера ответа на Ваш вопрос, если функция (е) занимает один байт, и вы имели два байта (b1 и b2), то:

f(b1 & b2) 

не будет работать, потому что b1 & b2 будет преобразован в преобразование в int, и int не может быть преобразован автоматически (потеря точности). Поэтому вам нужно будет ввести код:

f((byte)(b1 & b2)) 

Который вызывает раздражение.

И не беспокойтесь, спрашивая, ПОЧЕМУ b1 & b2 up-convertts - Я в последнее время ругался за это немного!

+4

amen-byte манипуляция в Java полна таких выбоин (обычно это тип, который почти невозможно поймать во время разработки). и почему в мире не может компилятор выяснить, что новый байт [] {0x01, 0x02} - это массив байтов?Зачем мне писать новый байт [] {(byte) 0x01, (byte) 0x02}?

+1

Вам нужно только указать значения, превышающие 0x7F, поскольку байты подписаны. В этом нет ничего раздражающего. Это намного лучше, чем наличие пустого знака без знака. Используйте IDE, он будет проверять безопасность типа и делать актеры для вас. Операция маски - это одна инструкция, она не влияет на производительность. –

6

согласно javadoc для OutputStream, 24 старших разряда игнорируются этой функцией. Я думаю, что метод существует для соображений совместимости: поэтому вам не нужно сначала преобразовывать в байты, и вы можете просто передать целое число.

рассматривает

+2

совместимость с чем, правда? – skaffman

+1

хорошо, совместимость может быть неправильным словом для этого ... давайте скорее называть его простотой или программным обеспечением; o) – Atmocreations

+0

Разрыв между 'write (int)' и 'write (byte [])' довольно впечатляет, хотя , особенно когда вы видите, что реализация по умолчанию 'write (byte [])' просто вызывает 'write (int)' в цикле. – skaffman

24

Таким образом, вы можете сигнализировать EOF:.

«Обратите внимание, что чтение() возвращает целочисленное значение Если вход представляет собой поток байтов, почему не читает() возвращает значение в байтах • Использование int в качестве возвращаемого типа позволяет read() использовать -1, чтобы указать, что он достиг конца потока ».

http://java.sun.com/docs/books/tutorial/essential/io/bytestreams.html

+0

mhm, good point – Atmocreations

+7

Итак, если вы пишете (-1), что происходит? Закрывает ли он поток? :-) – Ken

+0

Нет. В результате вы создаете странные символы Unicode для вывода потока. Но если бы был поток для записи для записи (-1), я верю, что это будет сигналом конца потока к этому потоку. Существует 3 возможности для потоковой передачи: первые 2 передают определенное количество байтов: write (byte [] b, int off, int len) и write (byte b). Третий параметр позволяет передавать неопределенное количество байтов с помощью int. Вот почему используется int. – sfish

2

Классы Java IOStream были частью Java начиная с версии 1.0. Эти классы занимаются только 8-битными данными. Я предполагаю, что интерфейс был спроектирован так, чтобы один метод write (int b) вызывался для значений int, short, byte и char. Все они продвигаются до цели. Фактически, поскольку большинство JVM работают на 32-битных машинах, примитив int является наиболее эффективным типом, с которым приходится иметь дело. В любом случае компилятор может хранить такие типы, как байты, используя 32 бита. Интересно, что байт [] действительно хранится в виде последовательности из 8 бит байтов. Это имеет смысл, так как массив может быть довольно большим. Однако в случае единичных примитивных значений, таких как int или byte, конечное пространство, занимаемое во время выполнения, на самом деле не имеет значения, если поведение соответствует спецификации.

Более фон:

http://www.java-samples.com/showtutorial.php?tutorialid=260

Предположение для классов IOStream является то, что абонент только действительно заботится о низкой 8 бит данных, даже при переходе в междунар. Это нормально, поскольку вызывающий абонент знает, что он действительно имеет дело с байтами, но становится проблемой, когда базовые данные - это действительно текст, который использует некоторую другую кодировку символов, такую ​​как многобайтовый Unicode. Вот почему классы Reader были введены обратно с Java 1.1. Если вам нужны текстовые данные и производительность, классы IOStream работают быстрее, но классы Reader более переносимы.

2

Возможно, это связано с тем, что байты по умолчанию подписаны, а файлы хранят байты как значения без знака. Вот почему read() возвращает int -, чтобы дать 255 вместо -1 для $ FF. То же самое с write(int), вы не можете хранить $ FF как 255 в байте.

Смежные вопросы