2012-12-20 63 views
2

當我複製到InputstreamOutputStream,我有時會出現EOFException它是安全返回,同時拋出: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

順便說一下,這個代碼是用來從互聯網上獲取html的。 – jackalope

回答

2

EOFException類不能在InputStream.read被拋出(字節[]),它的API表示拋出IOException,「如果第一個字節由於文件結尾以外的任何原因而無法讀取......」。

EOFException被用於其他目的,例如。如果輸入流在讀取所有字節之前到達結尾,java.io.DataInputStream.readFully(byte [] b)可能會拋出EOFException。

但是,在任何情況下,EOFException類都表示出現了錯誤,你不應該忽視它,並返回,就好像什麼都沒有發生。

+1

在我的情況下讀取的事情,當這種情況發生'InflaterInputStream' – jackalope

+1

1)的InflaterInputStream API不說,2)查看的InflaterInputStream源EOFException類在代碼中,只有和拋出:ZipException從未IOException異常拋出。 –

+0

對不起,它實際上是'GZIPInputStream' – jackalope

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 ...

+0

好點..... – jackalope

+0

但是當這個異常頻繁發生時printStackTrace()很差.. – jackalope

+0

異常將會發生_never_。該條件的同時,確保此... –

0

InputStream.read(byte[])只會嘗試填充儘可能多的字節,因爲它可以讀入byte[],如果它到達EOF,將返回-1。所以EOFException不會被正常拋出。 EOFException因意外情況而被拋出。因此,理想情況下,應該拋出此異常而不是捕獲它,因爲這意味着邏輯本身存在錯誤。

您應該使用InputStream.read(byte[]) == -1來檢查EOF。使用異常來確定是否到達流尾是一個壞主意,因爲異常很昂貴。

相關問題