Когда произойдет исключение 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