5

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

4 回答 4

11

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

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

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

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

顺便说一句,如果您使用 read() 您将在没有 EOFException 的情况下在 EOS 上获得 -1

于 2013-07-10T07:21:02.020 回答
1

DataInputStreamJavadoc

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

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

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

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

于 2013-07-10T07:22:50.020 回答
0

这取决于您何时使用客户端 - 服务器实现并且客户端“始终处于运行状态”并且套接字始终保持。

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

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

于 2015-04-12T10:26:57.100 回答
0

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

于 2013-07-10T07:35:07.460 回答