2013-07-10 119 views
2

我不知道为什么会出现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) 
+0

你在哪一行得到异常? –

+0

当b = inputStream.readByte();在while(b!= -1) – Yusuf1494

+0

错误,那就是当试图从*文件实际读取时。 – EJP

回答

8

DataInputStream.readByte API并不表示它返回-1 EOS,它说

返回:该输入流的下一个字节作为有符号的8位字节。

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

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

BTW如果你使用read(),你会得到-1 EOS不EOFException类

+0

所以如果出现EOFException,那意味着DataInputStream是否写完字节? – Yusuf1494

+1

是的,这意味着没有更多的字节,流EOS结束。顺便说一句如果你使用read(),你会得到-1没有EOFException –

+0

奥克感谢它的工作!谢谢Evgeniy Dorofeev :) – Yusuf1494

1

DataInputStream Javadoc

数据输入流允许应用程序从底层输入读取基本Java数据类型以机器无关的方式进行流式传输。

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

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

但是再次考虑使用BufferedInputStream,因为它可能是您所需要的。

0

您已经阅读了字节,那么您为什么再次阅读它?加上你的检查是不正确的,你不会得到-1的DIS.readByte。尝试使用read()。

0

这取决于当你使用客户端 - 服务器实现和客户端是“总是”和套接字保持全部时间。

如果套接字连接已启动并且您使用ObjectInputStream,则当socket.close()isnt时,客户端关闭套接字(socket.close)或“java.net.SocketException:Connection”重置将会出现“EOFException”检查终于肯定...

但是,如果你保持客户端和套接字连接了ObjectInputStream.readObject()将留下来,听听你在这种情况下想要什么。是的,当你只调用read()时,你会得到-1,如果客户端被杀死,并且你正在为一个客户端处理一个线程在服务器上,你将只会得到-1,线程将先前生活(如果你不杀它manualy或杀整个服务器)

相关问题