Java 发生EOFEException时返回安全吗

Java 发生EOFEException时返回安全吗,java,inputstream,Java,Inputstream,当我将Inputstream复制到OutputStream时,有时会出现eofeexception 根据EOFEException的文件,数据输入流可使用EOFEException发送流结束信号 那么,这是否意味着在发生EOFEException时返回是安全的 public static void copy(InputStream in, OutputStream out) throws IOException { byte[] buff = new byte[BUF_SIZE]; int n

当我将
Inputstream
复制到
OutputStream
时,有时会出现
eofeexception

根据
EOFEException的文件,数据输入流可使用EOFEException
发送流结束信号

那么,这是否意味着在发生
EOFEException
时返回是安全的

public static void copy(InputStream in, OutputStream out) throws IOException {

byte[] buff = new byte[BUF_SIZE];
int n = -1;

try {
  while ((n = in.read(buff)) >= 0) {
    out.write(buff, 0, n);
  }
} catch (EOFException eof) {
  // reach EOF , return
}

}

如果从
输入流中正确读取,则不会引发此异常。如果没有更多数据,则应到达文件末尾。最后一次调用
read
将返回
-1
,以后所有调用
read
将抛出异常。捕获异常时返回值是安全的,但应完全避免错误。这样做应该可以:

public static void copy(InputStream in, OutputStream out) throws IOException {

  byte[] buff = new byte[BUF_SIZE];
  int n = -1;

  try {
    while ((n = in.read(buff)) != -1) { //See the JavaDoc
      out.write(buff, 0, n);
  }
  catch (IOException eof) {
     e.printStackTrace(); //So you know if something happens...
  }
}

顺便说一句,
read
方法抛出一个
IOException
,而不是
eofeexception

eofeexception不能在InputStream.read(byte[])中抛出,它的API说IOException被抛出“如果第一个字节由于文件结尾以外的任何原因无法读取……”

EOFEException用于其他目的,例如java.io.DataInputStream。如果输入流在读取所有字节之前到达末尾,readFully(字节[]b)可能会抛出EOFEException

但是,在任何情况下,EOFEException都表示发生了错误,您不应该忽略它并像什么也没发生一样返回

InputStream.read(byte[])
将尝试将尽可能多的字节填充到
byte[]
中,如果达到EOF,它将返回
-1
。因此,
EOFEException
不会正常抛出<代码>EOFEException
因意外情况而引发。因此,理想情况下,您应该抛出这个异常,而不是捕获它,因为这意味着逻辑本身存在错误


您应该使用
InputStream.read(byte[])==-1
检查EOF。使用异常来确定是否到达流的结尾是个坏主意,因为异常是昂贵的。

顺便说一句,当我从internet获取html时会使用此代码。在我的情况下,当从
InflaterInputStream
1)InflaterInputStream API读取内容时会发生这种情况。2)See InflaterInputStream source EOFEException从未在代码中抛出,只有ZIPException和IOException。抱歉,它是
gzip输入流
实际上它也没有在它的API中声明。但无论如何,这都是不正常的情况。这不是正常的EOF”//reach EOF,return“不捕获是的,这是不正常的,服务器端发送的字节数超出了预期,因此发生了此异常。