2010-10-19 129 views
1

我對將文件逐步讀入緩衝區的步驟有點困惑。需要幫助理解Stream.Read()

從MSDN文檔

public abstract int Read(
    byte[] buffer, 
    int offset, 
    int count 
) 

C# Examples

FileStream fileStream = new FileStream(filePath, FileMode.Open, FileAccess.Read); 
try 
{ 
    int length = (int)fileStream.Length; // get file length 
    buffer = new byte[length];   // create buffer 
    int count;       // actual number of bytes read 
    int sum = 0;       // total number of bytes read 

    // read until Read method returns 0 (end of the stream has been reached) 
    while ((count = fileStream.Read(buffer, sum, length - sum)) > 0) 
     sum += count; // sum is a buffer offset for next reading 

源I可以說,線fileStream.Read(buffer, sum, length - sum)爲「fileStreamsum(偏移)到length - sum(總字節讀取讀入)到buffer「。 OK,所以在開始時,sum = 0時,我將在1短時間內有效地將整個fileStream讀入緩衝區,但我認爲情況並非如此。也許Read()讀取任何它可能會進入緩衝區?然後返回,以便你可以Read()它呢?我有點困惑。

回答

11

Read將讀取任何可用的內容(阻塞,直到東西可用),但可能沒有足夠的數據準備好填充緩衝區開始。

想象一下通過網絡下載數據 - 可能要下載數兆字節的數據,但只有部分數據可用於下載。所以你需要繼續撥打Read(),直到你閱讀完你想要的內容。

Stream.Read會讀取最多您要求的字節數,但可以輕鬆讀取更少。無可否認,對於本地文件流,我懷疑它總是按照你所要求的讀取,除非文件較短,但是對於一般的流不是這樣,我認爲即使對本地文件流也是如此保證

+0

嗯,那麼'fileStream.Length'會被設置爲實際的總長度嗎?不只是有什麼可用的? – 2010-10-19 08:59:47

+0

@jiewmeng:那麼,'fileStream.Length'將是您讀取該長度時文件的長度。該文件可能會改變之間的時間和你讀數據的時間。 – 2010-10-19 09:06:56

+0

那麼我猜它只會增加?我還想知道緩衝區是如何逐步讀取文件的,以便應用程序不會使用太多內存?我懷疑這是...只是檢查 – 2010-10-19 09:21:35

0

從MSDN:

When overridden in a derived class, reads a sequence of bytes from the current stream and advances the position within the stream by the number of bytes read. 

Return Value 

Type: System.Int32 
The total number of bytes read into the buffer. This can be less than the number of bytes requested if that many bytes are not currently available, or zero (0) if the end of the stream has been reached. 
1

Read方法將讀取至少一個字節,並指定的字節至多數量。

該方法通常會返回當前可用的所有數據。如果數據流例如通過互聯網傳遞,它通常會返回已收到的內容,對於文件流它通常會返回整個文件。

但是,決定什麼是最佳行爲取決於實施。例如,它可能首先返回它可以從文件緩存中獲得的內容,這可以立即返回,並讓您再次調用獲取需要實際讀取磁盤的數據。

使用Read方法時,應始終使用循環,以確保獲取所有數據。如果第一個調用看起來總是返回所有數據,但似乎並不是必須的,但可能會出現這種情況。

+0

對@Jon Skeet提出了同樣的問題:不知何故,'fileStream.Length'將被設置爲實際的總長度?不只是有什麼可用的? – 2010-10-19 09:00:22

+0

我還想知道緩衝區是否與逐步讀取文件有關,以便應用程序不會使用太多的內存?我懷疑它tho ...只是檢查 – 2010-10-19 09:20:38

+0

@jiewmeng:如果可用,'Length'屬性將被設置爲總長度。對於長度未知的流,該屬性不可用,並拋出'NotSupportedException'。是的,讀取流的這種方式的原因是它可以逐步讀取,因爲讀取整個文件使用的內存太多,或者因爲整個流尚不可用。 – Guffa 2010-10-19 09:33:12