2011-02-28 60 views
49

C++和C#都使用這個詞stream來命名許多類。流的含義是什麼?它有什麼特點?

  • C++:iostreamistreamostreamstringstreamostream_iteratoristream_iterator等。
  • C#:StreamFileStream,MemoryStream,BufferedStream等等。

所以它讓我很好奇知道stream是什麼意思?流的特徵是什麼?我什麼時候可以用這個詞來命名我的課程?這僅限於文件I/O類嗎?據我所知,C不會在任何地方使用這個詞。

+4

+1問一個好問題! – Nawaz 2011-02-28 16:50:22

+2

+1另一種更正式的方式來問同一個問題:什麼是流的抽象數據類型? – 2011-02-28 17:33:40

回答

65

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

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

+18

+1我們不能倒帶互聯網,但阿爾戈爾或大塊諾里斯可能。 – bryanbcook 2011-02-28 16:50:04

+5

+1我在下次創建一個類流的類:'io_hose','memory_hose','network_hose'時,會使用'hose'這個名字。 ; P儘管如此,這個偉大的比喻! – 2011-02-28 17:35:58

+1

@Emile:你不會是第一個。例如,Twitter使用諸如「firehose」,「gardenhose」和「spritzer」之類的名稱。 – Brian 2011-03-03 17:15:05

3

I/O Streams(雖然在Java中,意思是在C++/C#相同)

一個I/O流表示輸入 源或輸出目的地。一個 流可以表示許多不同的源和目的地, 包括磁盤文件,設備,其他 程序和存儲器陣列。

流支持許多不同種類的數據,包括簡單字節 原始數據類型,本地化 字符和對象。一些流 只是傳遞數據;其他人操縱 並以有用的方式轉換數據。

不管他們內部是如何工作的, 所有流呈現相同的簡單 模型來使用這些程序:一個 流數據的序列。 A 程序使用輸入流從源讀取 數據,其中一個項目在 時間。

在C#中,您提到的流派生自抽象基類Stream。這個基類的每個實現都有一個特定的目的。

例如,FileStream支持對文件的讀/寫操作,而MemoryStream支持內存中的流對象。與FileStreamMemoryStream類不同,BufferedStream類允許用戶緩衝I/O。

除了上面的類,還有其他幾個類實現Stream類。有關完整列表,請參閱Stream類中的MSDN documentation

3

這裏有幾個不同的含義。 #1是你可能的意思,但你可能也想看看#2。

  1. 在像您提到的那些的庫中,「流」只是爲「二進制數據」的抽象,其可以是或可以不是隨機存取(與數據被連續產生,如如果您正在編寫生成隨機數據的流),或者可以將其存儲在任何地方(在RAM中,在硬盤上,通過網絡,在用戶的大腦中等)。它們非常有用,因爲它們可以避免細節,並編寫不關心流的特定源的通用代碼。

  2. 作爲更一般的計算機科學概念,「流」有時被認爲是「有限或無限量的數據」(鬆散地)。沒有一個例子,這個概念有點難以解釋,但是在函數式編程中(例如在Scheme中),可以通過將對象的歷史記錄視爲變化的「流」來將狀態變爲無狀態的對象。 (其思想是對象的狀態可能會隨着時間而改變,但如果將對象的整個生命視爲一個「流」變化,那麼整個流將永遠不會改變,並且可以對它進行函數式編程。)

0

<stdio.h>中定義的C函數對流進行操作。

Section 7.19.2 in C99討論了它們如何表現,儘管不是它們是什麼,除了「有序的字符序列」之外。

rationale給出了相應部分的更多方面,首先:

C派生其文本的概念,從它誕生的UNIX環境流。

所以這就是概念的來源。

2

撇開官方說法和解釋,字本身是從「現實生活」stream - 取代水,數據從一個地方轉移到另一個地方。

關於您提出的問題,仍然沒有被回答,您可以在包含流的名稱中命名自己的類,但只有在實現某種新流時才具有正確的含義。

相關問題