Когда произойдет исключение EOFException в потоках JAVA
Я работаю с DataInputStream и задал вопрос об EOFExceptions.
В соответствии с java docs:
Сигналы о том, что конец файла или конец поток неожиданно достигнут во время ввода.
Это исключение в основном используется данными входные потоки к сигналу конца потока. Обратите внимание, что многие другие операции ввода вернуть специальное значение в конце поток, а не бросать исключение.
Означает ли это, что когда генерируется EOFException, поток больше не будет открываться? Означает ли это, что вы никогда не должны ожидать от него каких-либо данных?
Если выходной поток подключен к входному потоку и выходу output.close(), будет ли входной поток получать исключение EOFException или исключение IOException?
IOException описывается как:
Сигналы о том, что исключение ввода-вывода некоторых sort произошел. Этот класс является общий класс исключений сбой или прерывание ввода/вывода операции.
Замыкает ли поток вывода или EOFException или исключение IOException на стороне потока данных?
Ответы
Ответ 1
Ключевое слово неожиданно.
Если вы используете DataInputStream и читаете целое число 4 байта, но в потоке осталось всего 3 байта, вы получите исключение EOFException.
Но если вы вызываете read() в конце потока, вы получите только -1 и не будете исключать.
Ответ 2
Когда вы достигнете конца потока (конец файла или одноранговый узел закрывает соединение):
-
read()
возвращает -1
-
readLine()
возвращает null
-
readXXX()
для любых других X-бросков EOFException
.
Поток все еще открыт, но вы должны прекратить его читать и закрыть.
Ответ 3
EOFException - это подкласс IOException. Он будет сброшен, если вы попытаетесь прочитать из потока, и больше нет данных для чтения (например, потому что ваш DataInputStream обернут вокруг FileInputStream, и вы пытаетесь прочитать больше байтов, чем осталось в файле).
Ответ 4
Отвечая на другую часть вашего вопроса: Да, EOF означает, что больше нет данных в потоке; вы должны закрыть его.
Ответ 5
Вызывается EOFException:
- если нет данных в STREAM, но вы пытаетесь прочитать... например, прочитайте методы сетевых потоков, таких как DataInputStream, ObjectInputStream, RandomAccessFile, выпустите EOFException, если они пытаются читать из FileInputStream, но FileInputStream пуст
- или если форматы не совпадают... например, если int присутствует, и вы используете readFloat() DataInputStream