流是位數據經過通訊路徑的連續傳送序列。它是單向的,從一個應用程序的角度,流能夠是輸入流(讀操做流)或者輸出流(寫操做流),除了基於文件的流以外,其他的都是non-seekable的。一旦流數據被提供或者被使用,數據就不可以從流中獲取到。
編程
Cocoa包括三種與流有關的類:NSStream,NSInputStream,NSOutputStream. NSStream是抽象類,它定義了流對象的基本接口和屬性。NSInputStream和NSOutputStream是NSStream的子類,它們實現了輸入流和輸出流的基本操做。你能夠爲存儲在內存中,向文件或者C buffer寫的流數據建立NSOutputStream對象;能夠爲從NSData對象和文件中讀取的流數據建立NSInputStream對象;也能夠在網絡套接字的兩端建立NSInputStream和NSOutputStream對象,經過流對象,你能夠不用一次性將全部的流數據加載到內存中。下圖是就輸入流和輸出流對象的源和目的地爲依據對輸入流和輸出流的分類:安全
NSStream及其子類進行的是比較底層的開發,對於某些特殊的需求若是有頂層的Cocoa API更加適合的話(好比NSURL,NSFileHandle),那麼就用頂層的API進行編程。網絡
流對象有許多屬性,大多數屬性都和網絡安全及其配置有關,也就是SSL和SOCKS代理信息。另外有兩個重要的屬性,一個是NSStreamDataWrittenToMemoryStreamKey,對於一個輸出流它能夠用來獲取到寫入內存中的數據。另外一個是NSStreamFileCurrentOffsetKey,對於一個基於文件的流,能夠用它操做讀或者寫的位置。異步
每一個流對象都有一個與其相關聯的delegate,若是其delegate沒有顯示的設置,那麼這個流對象自身成爲其delegate(對於自定義子類的話這是一個頗有用的約定)。流對象調用它惟一的delegate方法stream:handleEvent:來處理全部與stream-related事件。對於傳入參數中的events事件,它指示了何時輸入流中有數據可供讀入,何時輸出流中有空間可供數據寫入。對於這兩個事件中的NSStreamEventHasBytesAvailable事件,delegate向該stream發送read:maxLength:消息從流中讀取數據,對於NSStreamHasSpaceAvailable事件,delegate向該stream發送write:maxlength:向流中寫入數據。ide
NSStream是創建在Core Foundation的CFStream層之上的。這層緊密的關係意味着NSStream的具體子類-NSInputStream和NSOutputStream與Core Foundation中的CFReadStream和CFWriteStream是一一對應的。儘管Cocoa和Core Foundation的stream APIs有很大的類似性,可是它們的實現卻不盡相同,Cocoa stream類使用delegate模式來實現異步操做(好比將其佈置在run loop之上),而Core Foundation使用客戶端的回調。Core Foundation的stream類型設置的是client(在Core Foundation中叫作context),NSStream中設置的delegate,這是兩個不一樣的概念,不該該把設置delegate和設置context搞混淆。oop
相比CFStream而言,NSStream有更強的可擴展性,你能夠生成NSStream,NSInputStream,NSOutputStream的子類來自定義其屬性和方法。For example, you could create an input stream that maintains statistics on the bytes it reads; or you could make a NSStream
subclass whose instances can seek through their stream, putting back bytes that have been read. NSStream
has its own set of required overrides, as do NSInputStream
and NSOutputStream
.ui