当我将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
}
}
答案 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。使用异常来确定是否到达流的末尾是一个坏主意,因为异常是昂贵的。