2017-01-10 5 views
0

Я изучаю java.io. В документации read() метода, я видел определение:Почему метод read() возвращает -1 в EOF?

чтения() метод возвращает ASCII-код входных байт (0-255) и возвращает -1 в конце файла

Кроме того, как я знаю, код ASCII EOF равен 26.

Почему метод read() возвращает -1 вместо 26 для EOF. И что означает значение возврата -1?

Еще один вопрос: что такое нулевой символ (то есть NUL), код ASCII: 0, используемый для? И если файл пуст (т. Е. Не имеет данных), существует ли символ NUL или нет?

+2

какой 'read()' метод? Какой класс ? – Mritunjay

+2

Характер 'EOF' ... проблематичен. На самом деле он больше не используется для обозначения конца файлов. В противном случае, что произойдет, если вам понадобится номер 26? – chrylis

+1

Где вы нашли эту цитату? Конечно, это не javadoc ['InputStream.read()'] (http://docs.oracle.com/javase/8/docs/api/java/io/InputStream.html#read--), так как читать байты, а не символы ASCII. Пожалуйста, обратитесь к своему источнику, потому что он, вероятно, фиктивный/ошибочный. – Andreas

ответ

2

Я видел определение: «чтение() метод возвращает ASCII-код входных байтов (0-255) и возвращает -1 в конце файла»

Это определение неверно. Метод read() не возвращает ASCII. Он возвращает байты, а мест не интерпретируется на них. Для двоичного файла они определенно не являются кодами ASCII.

Вот это определение InputStream.read()реального ..., как это определено в javadoc:.

"public abstract int read() throws IOException

Читает следующий байт данных из входного потока Значение байта возвращается как int в диапазоне от 0 до 255. Если байт недоступен, поскольку конец потока достигнут, возвращается значение -1. ​​"

Обратите внимание, что в ASCII не упоминается.


Кроме того, как я известно, ASCII-код EOF является 26.

На самом деле, не существует ASCII-символов, что означает EOF. Код 26 (CTRL-Z) - это символ ASCII SUB. Используется на клавиатурном вводе для обозначения EOF в Windows, но не в других контекстах. Действительно, для Mac OS и Linux ASCII код 4 (CTRL-D) служит для этой цели.

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


Еще один вопрос: нулевой символ (NUL), ASCII-код: 0, для чего используется?

Все виды вещей. Действительно, все, что приложение выбирает, использовать его для.

И если файл пуст (нет данных), символ NUL существует или нет?

Символ NUL не представляет собой пустой файл или конец файла.

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

1

Допустимый диапазон значения byte чтения из файла (на «современный файл» системы) 8 бит (то есть, это не обязательно ASCII кодируются, это может быть двоичным). Так как любое значение от 0 до 255 может быть возвращено, необходимо было указать конец файла каким-либо образом. Вы можете предпочесть классы и методы, доступные из java.nio (обычно) и методы чтения, доступные в Files (в частности) при работе с небольшими файлами.