2012-04-08 3 views
9

This показывает, что это так, что метод может возвращать -1, когда он хочет указать, что больше нет байтов для чтения.Почему read() в FileInputStream возвращает целое число?

Но байт варьируется от -128 до 127, не так ли? И не имеет ли смысл, чтобы возвращаемый тип read() был байтом, так как он возвращает байт?

Спасибо за ваше время.

ответ

3

Причина, по которой он возвращает значение как int, заключается в том, что ему необходимо вернуть значение между 0-255, а также указать, когда больше нет байтов для чтения из файла. Используя int, вы можете вернуть весь диапазон положительных значений без знака 0-255, а также указать, когда файл будет завершен. Он не сможет предоставить это только 256 различных значений значения byte, половина из которых отрицательна по умолчанию Java.

1

Байт данных представляет собой значение без знака в диапазоне от 0 до 255, в то время как byte в Java определяется в диапазоне от -128 до 127, который не имеет смысла при чтении двоичных данных. read() возвращает целое число, позволяющее использовать все неотрицательные значения для представления достоверных данных и отрицательное значение для окончания передачи данных.

В целом, функция должна указывать на условие ошибки или исключение, используя другой механизм из того, который он использует для возврата данных. В простейшем случае он может вернуть значение, которое нельзя использовать для представления достоверных данных, чтобы его значение было однозначным.

3

Конечно, но JavaDocs идти дальше сказать ..

Возвращает:
общее количество прочитанных байтов в буфер, или -1, если нет больше данных потому что конец файла достигнут.

Надеюсь, более 127 байтов могут считываться из потока за раз.

+1

Я тоже сделал эту ошибку - метод read() фактически возвращает один байт данных, а не количество байтов, которое можно прочитать. http://docs.oracle.com/javase/7/docs/api/java/io/FileInputStream.html#read%28%29 – wattostudios

+0

@Andrew Thompson Я думаю, что вы читаете документацию неправильного метода. Вы читаете одно для ** public int read (byte [] b) **, где, поскольку я имею в виду ** public int read() ** – GrowinMan

+0

Существует несколько различных методов 'read()'. Один возвращает один байт; другие заполняют массив и возвращают _number_ байтов, которые были прочитаны. –

1

Вопрос: не было бы лишним смысл для возвращаемого типа read() быть байт?

A: Нет, поскольку «байт» не может вернуть весь диапазон 0..255 (без знака), а «короткий» - это просто PITA.

+0

Хорошо. Я думал, возможно, используя внутренние манипуляции на уровне бит, данные могут быть сохранены в самом подписанном формате. Это было глупо, но теперь я вижу. Во всяком случае, мне любопытно узнать, почему короткая это PITA? – GrowinMan

+1

PITA == «Pain in the gluteus mAximus»;) – paulsm4

+0

Просто потому, что номера в Java по умолчанию являются значениями 'int', поэтому, если бы это была« короткая », вам нужно было бы делать преобразования от« short »до' int', даже если конверсии обрабатываются автоматически с помощью Java-механизма – wattostudios

0

Класс FileInputStream позволяет читать содержимое файла как поток байтов. Вот простой пример:

InputStream input = new FileInputStream("c:\\data\\input-text.txt"); 

int data = input.read(); 
while(data != -1) { 
    //do something with data... 
    doSomethingWithData(data); 

    data = input.read(); 
} 
input.close(); 

Примечание: для ясности здесь пропущено правильное исключение. Чтобы узнать больше о правильной обработке исключений, перейдите на Java IO Exception Handling.

Метод read() FileInputStream возвращает int, который содержит байтовое значение байта. Если метод read() возвращает -1, больше нет данных для чтения в потоке, и его можно закрыть. То есть -1 в качестве значения int, а не -1 в качестве значения байта. Здесь есть разница!

+0

-1 из-за «То есть, -1 как значение int, а не -1 в качестве значения байта. Здесь есть разница!». Что такое оценка '((byte) -1) == ((int) -1)'? Конечно, это 'истина', потому что байт от -128 до 127, что означает, что -1 также является законным байтовым значением. –

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