Когда произойдет исключение EOFException в потоках JAVA - PullRequest
15 голосов
/ 20 марта 2009

Я работаю с DataInputStream и у меня возник вопрос об исключениях EOFException.

Согласно документам Java:

Сигналы о том, что конец файла или конец поток был достигнут неожиданно во время ввода.

Это исключение в основном используется данными входные потоки сигнализируют об окончании потока. Обратите внимание, что многие другие операции ввода вернуть специальное значение в конце поток, а не бросать исключение.

Означает ли это, что когда генерируется исключение EOFException, поток никогда не будет снова открываться? Значит ли это, что вы НИКОГДА не должны ожидать от него больше данных?

Если выходной поток подключен к входному потоку и вызывается outputtream.close (), получит ли входной поток EOFException или IOException?

IOException описывается как:

Сигнализирует, что исключение ввода-вывода некоторых сортировка произошла Этот класс общий класс произведенных исключений неудачным или прерванным вводом / выводом операции.

Создает ли выходной поток либо EOFException, либо IOException на стороне datainputstream?

Ответы [ 5 ]

7 голосов
/ 04 января 2014

Когда вы достигаете конца потока (конец файла, или узел закрывает соединение):

  • read() возвращает -1
  • readLine() возвращает ноль
  • readXXX() для любых других бросков Х EOFException.

Поток все еще открыт, но вы должны прекратить чтение с него и закрыть его.

7 голосов
/ 20 марта 2009

Ключевое слово неожиданно.

Если вы используете DataInputStream и читаете 4-байтовое целое число, но в потоке осталось только 3 байта, вы получите исключение EOFException.

Но если вы вызовете read () в конце потока, вы просто получите -1 обратно, и никаких исключений.

4 голосов
/ 20 марта 2009

Отвечая на другую часть вашего вопроса: Да, EOF означает, что в потоке больше не будет данных; Вы должны закрыть его.

3 голосов
/ 20 марта 2009

EOFException является подклассом IOException. Он будет выдан, если вы попытаетесь прочитать из потока, и больше нет данных для чтения (например, потому что ваш DataInputStream обернут вокруг FileInputStream и вы пытаетесь прочитать больше байтов, чем осталось в файле).

0 голосов
/ 13 октября 2010

EOFException выдается:

  1. если в STREAM нет данных, но вы пытаетесь читать ... например, методы чтения цепочечных потоков, такие как DataInputStream, ObjectInputStream, RandomAccessFile, генерируют EOFException, если они пытаются читать из FileInputStream, но FileInputStream пуст
  2. или если форматы не совпадают ... например, если присутствует int и вы используете readFloat () из DataInputStream
...