2012-12-20 2 views
2

InputstreamOutputStream으로 복사 할 때 가끔 EOFException가 발생합니다.EOFException이 발생한 동안 돌아 오는 것이 안전합니까?

EOFException의 문서에서 데이터 입력 스트림이 스트림의 끝을 알리기 위해 사용할 수 있습니다.

EOFException이 발생했을 때 돌아 오는 것이 안전하다는 의미입니까? 당신이 InputStream에서 제대로 읽는다면

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

이 코드는 인터넷에서 html을 가져올 때 사용됩니다. – jackalope

답변

2

EOFException는이 (바이트 []) InputStream.read에 던져 질 수없는 그 API를 IOException는 "파일의 끝이 아닌 다른 이유 때문에 첫 번째 바이트를 읽을 수없는 경우 ..."라고 표시됩니다.

EOFException은 다른 용도로 사용됩니다. java.io.DataInputStream.readFully (byte [] b)는 모든 바이트를 읽기 전에 입력 스트림이 끝에 도달하면 EOFException을 throw합니다.

그러나 어떤 경우에도 EOFException은 오류가 발생했음을 나타내므로 무시하지 말고 아무 일도 일어나지 않는 것으로 반환해야합니다.

+1

제 경우에'InflaterInputStream'의 내용을 읽을 때 발생합니다 – jackalope

+1

1) InflaterInputStream API는이를 말하지 않습니다. 2) InflaterInputStream 소스 참조 ZopeException과 IOException 만 코드에서 EOFException이 throw되지 않습니다. –

+0

죄송합니다. 실제로는 'GZIPInputStream'입니다. – jackalope

0

,이 예외가 발생되지 않습니다. 더 이상 데이터가없는 경우 파일의 끝에 도달해야합니다. read에 대한 마지막 호출은 -1을 반환하며 나중에 모든 호출은 read으로 예외를 throw합니다. 예외를 잡을 때 값을 반환하는 것이 안전하지만 오류를 모두 피해야합니다. 이런 식으로 뭔가를 수행해야합니다

그런데
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 발생 ...

+0

좋은 지적 ..... – jackalope

+0

하지만이 예외가 자주 발생하면 printStackTrace()가 좋지 않습니다. – jackalope

+0

예외는 _ 발생하지 않습니다. while 조건은 이것을 보장합니다 ... –

0

InputStream.read(byte[])byte[]에 읽을 수있는만큼의 바이트를 채우려고하며, EOF에 도달하면 -1을 반환합니다. 따라서 EOFException은 정상적으로 처리되지 않습니다. 예기치 않은 상황에서 EOFException이 발생합니다. 따라서 논리 자체에 이상이 있음을 의미하기 때문에이 예외를 잡기보다는 던지기 만하면됩니다.

EOF를 확인하려면 InputStream.read(byte[]) == -1을 사용해야합니다. 예외가 비용이 많이 들기 때문에 예외를 사용하여 스트림의 끝 부분에 도달했는지 판단하는 것은 좋지 않습니다.

관련 문제