2

当我复制Inputstream到 时OutputStream,有时会出现EOFException.

EOFException从数据输入流可能使用的文档到流结束的信号。

那么这是否意味着EOFException发生 a 时返回是安全的?

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
}

}

4

3 回答 3

2

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

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

但是,无论如何,EOFException 表示发生了错误,您不应该忽略它并像什么都没发生一样返回。

于 2012-12-20T11:50:14.343 回答
0

如果您从 中正确读取InputStream,则不会引发此异常。当没有更多数据时,预计会到达文件末尾。最后一次调用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,而不是EOFException......

于 2012-12-20T11:47:10.673 回答
0

InputStream.read(byte[])只会尝试填充尽可能多的字节,如果它达到 EOF byte[],它将返回。-1所以EOFException不会被正常抛出。EOFException因意外情况而抛出。所以理想情况下你应该抛出这个异常而不是捕获它,因为这意味着逻辑本身有问题。

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

于 2012-12-20T11:53:36.837 回答