java.io.EOFException при попытке чтения из сокета

я не знаю, почему появляется java.io.EOFException. Я хочу написать файл после того, как получу двоичный поток с сервера.

Вот мой код

inputStream = new DataInputStream(new BufferedInputStream(connection.getInputStream()));
FileOutputStream fos = new FileOutputStream("D:/Apendo API resumable download.txt");

byte b = inputStream.readByte();
while(b != -1){
        fos.write(b);
        b = inputStream.readByte();                       
       }
fos.close();

Трассировка стека

java.io.EOFException
at java.io.DataInputStream.readByte(DataInputStream.java:267)
at HttpRequestJSON.JSONRequest.sendRequest(JSONRequest.java:64)
at HttpRequestJSON.Main.main(Main.java:56)

person Yusuf1494    schedule 10.07.2013    source источник
comment
в какой строке вы получаете исключение?   -  person Sandiip Patil    schedule 10.07.2013
comment
когда b = inputStream.readByte(); в то время как (b! = -1)   -  person Yusuf1494    schedule 10.07.2013
comment
Ошибаетесь, это при попытке читать из файла.   -  person user207421    schedule 10.07.2013


Ответы (4)


DataInputStream.readByte API не говорит, что возвращает -1 на EOS, он говорит

Возвращает: следующий байт этого входного потока в виде 8-битного байта со знаком.

Выдает: EOFException - если этот входной поток достиг конца.

Предполагается, что при работе с DataInputStream.readByte мы знаем, сколько байт осталось в потоке. В противном случае мы можем использовать EOFException как индикатор EOS.

Кстати, если вы используете read(), вы получите -1 на EOS без исключения EOFException.

person Evgeniy Dorofeev    schedule 10.07.2013
comment
поэтому, если появляется EOFException, это означает, что DataInputStream заканчивает запись байта? - person Yusuf1494; 10.07.2013
comment
Да, это означает, что байтов больше нет, конец потока EOS. Кстати, если вы используете read(), вы получите -1 без EOFException - person Evgeniy Dorofeev; 10.07.2013
comment
Это означает, что он закончил чтение, ради бога. Входные потоки ничего не пишут. - person user207421; 10.07.2013

Из DataInputStream Javadoc:

Поток ввода данных позволяет приложению считывать примитивные типы данных Java из базового потока ввода машинно-независимым способом.

Я не уверен, нужно ли вам это, но вы можете решить сами. В общем, если вы просто загружаете данные и записываете в файл, он вам не понадобится — просто придерживайтесь BufferedInputStream.

Метод readByte() считывает один байт (отсюда и название) и выдает EOFException, когда поток достигает конца, прежде чем считать все байты. Это может показаться немного запутанным, но исключение выдается при чтении ввода, а не при записи файла. Фактически, это единственный способ определить, закончился ли DataInputStream.

Но еще раз, рассмотрите возможность использования только BufferedInputStream, так как это, вероятно, все, что вам нужно.

person mthmulders    schedule 10.07.2013

Вы уже прочитали байт, тогда почему вы снова читаете его в то время? Кроме того, ваша проверка в то время как неверна, вы не получите -1 для DIS.readByte. Попробуйте использовать чтение().

person Sandiip Patil    schedule 10.07.2013

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

если подключение к сокету установлено, и вы используете, например, ObjectInputStream, поэтому «EOFException» появится, когда клиент закроет сокет (socket.close) или сброс «java.net.SocketException: Connection» появится, когда socket.close () не проверяет, наконец, для Конечно...

Но если вы сохраните подключение клиента и сокета, ObjectInputStream.readObject() останется и будет слушать то, что вы хотите в этом сценарии. и да, когда вы вызываете только read(), вы получите -1, и если клиент убит, и вы обрабатываете для одного клиента один поток на сервере, вы получите только -1, и поток будет жить вечно (если вы не убьете его вручную или не убьете весь сервер)

person Ball    schedule 12.04.2015