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

尝试从套接字读取时发生java.io.EOFException,java,file,io,eofexception,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 = inputSt

我不知道为什么会出现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)
堆栈跟踪

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)

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

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

抛出:EOFEException-如果此输入流已到达末尾

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

顺便说一句,如果您使用read(),您将在EOS上获得-1,而无EOFEException

数据输入流允许应用程序以独立于机器的方式从底层输入流读取基本Java数据类型

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

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


但是,再次考虑使用<代码> BuffeldEndoStuts,因为它可能是你所需要的。

< P>你已经读过字节,那为什么你又一次读它呢?加上您在while的检查不正确,DIS.readByte将不会得到-1。尝试使用read()

这取决于您何时使用客户机-服务器实现,客户机“始终处于运行状态”,而套接字始终处于运行状态

如果套接字连接已启动,并且您使用例如ObjectInputStream,则当客户端关闭套接字(socket.close)时将出现“EOFEException”,或者当socket.close()未最终确认时将出现“java.net.SocketException:connection”重置


但如果您保持客户端和套接字连接,ObjectInputStream.readObject()将保持并侦听您在此场景中想要的内容。是的,当您调用only read()时,您将得到-1,如果客户端被终止,并且您在服务器上为一个客户端处理一个线程,那么您将只得到-1,线程将永远存在(如果您不手动终止它或终止整个服务器)

在哪一行获得异常?当b=inputStream.readByte()时;在while(b!=-1)Err中,实际上是在尝试读取文件时。因此,如果出现EOFEException,则表示DataInputStream已完成写入字节?是的,表示不再有字节,流结束EOS。顺便说一句,如果你使用read(),你将得到-1,没有EOFEException,这意味着它已经完成了阅读,看在上帝的份上。输入流不写任何东西。