尝试从套接字读取时java.io.EOFException

时间:2013-07-10 07:15:57

标签: java file 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)

4 个答案:

答案 0 :(得分:10)

DataInputStream.readByte API并没有说它在EOS上返回-1,它说

返回:此输入流的下一个字节为带符号的8位字节。

抛出:EOFException - 如果此输入流已到达结尾。

它假设在使用DataInputStream.readByte时,我们知道流中剩下多少字节。否则,我们可以使用EOFException作为EOS的指标。

BTW如果你使用read(),你将在没有EOFException的EOS上得到-1

答案 1 :(得分:1)

来自DataInputStream Javadoc

  

数据输入流允许应用程序以与机器无关的方式从基础输入流中读取原始Java数据类型。

我不确定你是否需要,但你可以自己决定。一般来说,如果您只是下载数据并写入文件,则不需要它 - 只需坚持使用BufferedInputStream

readByte()方法读取一个字节(因此名称),当流到达结束时它会在读取所有字节之前抛出EOFException。这可能听起来有点混乱,但抛出读取输入而不是写入文件的异常。事实上,这是确定DataInputStream是否已经结束的唯一方法。

但请再次考虑使用BufferedInputStream,因为它可能只是你需要的。

答案 2 :(得分:0)

你已经读过这个字节了,为什么你再一次读它呢?加上你的检查时间不正确,你不会得到-1的DIS.readByte。尝试使用read()。

答案 3 :(得分:0)

这取决于您何时使用客户端 - 服务器实现,而客户端是"总是在"和socket正在保持全时。

如果套接字连接已启动并且您使用例如ObjectInputStream,那么" EOFException"客户端关闭套接字(socket.close)或" java.net.SocketException:Connection"当socket.close()最终无法检查时,reset会显示...

但是,如果保持客户端和套接字连接,ObjectInputStream.readObject()将保留并在此方案中监听您想要的内容。是的当你只调用read()时你会得到-1并且如果客户端被杀死而你正在处理一个客户端一个线程在服务器上你将只得到-1并且线程将永远存在(如果你不杀死它或者杀死它)整个服务器)