2012-11-27 49 views
3

在OpenJDK7項目java.nio.file.Files中,有以下功能。我的問題是,如果while循環條件是> =而不是>?這是因爲source.read的javadoc說達到EOF時,它會返回-1而不是0JDK7 Files.copy

/** 
* Reads all bytes from an input stream and writes them to an output stream. 
*/ 
private static long copy(InputStream source, OutputStream sink) 
    throws IOException 
{ 
    long nread = 0L; 
    byte[] buf = new byte[BUFFER_SIZE]; 
    int n; 
    while ((n = source.read(buf)) > 0) { 
     sink.write(buf, 0, n); 
     nread += n; 
    } 
    return nread; 
} 

回答

1

您正在尋找在錯誤的讀取功能。 使用字節數組的InputStream的讀取函數將返回已複製到緩衝區中的字節數。所以你可以知道你可以拷貝多少個字節。

* @return  the total number of bytes read into the buffer, or 
*    <code>-1</code> if there is no more data because the end of 
*    the stream has been reached. 

因此,它涵蓋了兩種情況:流達到的末端(-1)或沒有任何字節由於任何其他原因被讀入緩衝區。

+0

功能的Javadoc說,它會從輸入讀取所有字節流。如果連接不良,下一個字節可能不會立即可用,則while循環將在獲取所有字節之前結束。不是嗎? – tanyehzheng

+0

@tanyehzheng這是不正確的。 ['InputStream.read'](http://docs.oracle.com/javase/7/docs/api/java/io/InputStream.html#read(byte []))的javadoc說,至少有一個字節將被退回,否則會阻止。如果第一個字節由於EOF之外的任何原因而無法讀取,那麼它會拋出一個'IOException'。對於此函數返回0的任何流都被錯誤地寫入,並且沒有正確地繼承'InputStream'。 (除非緩衝區是一個零長度的數組,否則如果條件改爲> = 0,那麼無論是處於阻塞模式還是非阻塞模式,它都會按預期工作。 – Brian

1

這是否是一個錯誤取決於函數的意圖。

正常情況下,這將與您預期的完全一致,因爲要調用read將會阻塞,直到至少有一個字節的數據可用。但是,如果輸入流是非阻塞的,當目前有沒有更多數據可用時,read呼叫將返回0。此狀態與正在關閉的流不同。

換句話說,人們可能會爭辯說這是一個錯誤,這取決於您在面對一個非阻塞流時所期望的做法,該流在調用方法時沒有可用數據。

+0

不是嗎? – tanyehzheng

+0

這取決於你的期望。當沒有更多數據可用時,是否要阻止它?此外,如果你這樣做,並且該流是非阻塞的,那麼在等待下一個字節的數據時,最終會消耗100%的CPU。這不是很好。 –

1

一樣,因爲這裏InputStream.read(byte[])不會返回0。從javadoc的

至少讀取一個字節