2017-05-12 106 views
1

我讀過緩衝區是字節序列。但是我也讀過Stream也是bytes.so的區別流&緩衝區有什麼區別?C#中緩衝區和流之間的區別

+0

緩衝區具有指定的確定長度,而流不具有指定的確定長度。 – ThePerplexedOne

+3

流是讀取和/或寫入的字節序列,而緩衝區是存儲的字節序列。 – Abion47

+1

@ Abion47正如你所說的緩衝區是爲了存儲字節序列,所以我的問題是流不存儲在內存中? –

回答

0

正如我在我的評論中所說的,緩衝區和流之間的區別在於流是一種將信息從指定源傳輸或傳輸到指定源的序列,而緩衝區是存儲在內存中的一系列字節。例如:

FileStream stream = new FileStream("filepath.txt",FileMode.open); 

打開一個流到一個文件。該流可以從中讀取,寫入或兩者兼有。因爲它不需要任何額外的內存,所以它輕量且快速,但在源中任意引用特定的一組數據可能會很麻煩。流也可以從連接而不是離散的數據集中受益,因此您無需事先知道數據的大小。

相反地:

byte[] fileContents = File.ReadAllBytes("filepath.txt"); 

讀取文件的所有字節到內存中。當你需要一次操作整個文件,或者爲你的程序保留一個「本地副本」以保持文件可用於其他用途時,這非常方便。但是,根據源的大小和可用內存量,包含整個文件的緩衝區可能不是一個選項。

雖然這只是一個準系統的解釋。還有更徹底的在那裏,例如,Marc Gravell puts it

許多數據結構(列表,收藏品等)作爲容器 - 他們持有一組對象。但不是流;如果列表是一個桶,那麼流是一個軟管。您可以從數據流中提取數據,或將數據推送到數據流中 - 但通常只能在一個方向上進行(當然也有例外)。例如,網絡上的TCP數據是一個流;您可以發送(或接收)大量數據,但只能與其他計算機連接,並且通常只能使用一次 - 您無法倒帶互聯網。

流也可以操縱通過它們的數據;壓縮碼流,加密碼流等等。但是,這裏隱含的隱喻是數據管道。一個文件通常也被作爲一個流訪問(在某個級別);您可以訪問連續數據塊。當然,大多數文件系統也提供隨機訪問,所以流確實提供了Seek,Position,Length等等 - 但並不是所有的實現都支持這樣的。尋找一些流,或者獲得一個開放套接字的長度沒有意義。

+0

我也讀過這個流有它的內部緩衝區。什麼是內部緩衝區的使用和使用它的地方。 –

+0

@neelmaheta流一般沒有內部緩衝區。 _特定種類的stream_有時可以做,比如'BufferedStream'或'MemoryStream'。 – Abion47

+0

我看到所有流都有其默認大小的內部緩衝區。您可以通過在默認緩衝區大小中傳遞它的值來更改默認緩衝區大小。在visual studio express edition 2013中的調試模式下,我看到了這一點 –

0

緩衝區具有指定的大小/長度,用於存儲數據。另一方面,Stream用於讀取和寫入從一個地方到另一個地方的信息。例如FileStream用於讀寫文件,流自身具有一個緩衝區,當填充到其最大大小時緩衝區將被刷新並讀取或寫入流中的數據。

相關問題