发生EOFException时返回是否安全

时间:2012-12-20 11:39:57

标签: java inputstream

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

EOFException的文档可能被数据输入流用于信号流的结束。

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

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
}

}

3 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分: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 ......

答案 2 :(得分:0)

InputStream.read(byte[])只会尝试填充可以读入byte[]的字节数,如果达到EOF,它将返回-1。所以EOFException不会被正常抛出。 EOFException因意外情况而被抛出。因此,理想情况下,您应该抛出此异常而不是捕获它,因为这意味着逻辑本身存在错误。

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