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“不捕获是的,这是不正常的,服务器端发送的字节数超出了预期,因此发生了此异常。