Stream 1 關於Stream的知識分享

2022-02-14 04:44:32 字數 4860 閱讀 7489

一、什麼是stream

查了一下msdn,他是這麼解釋的:提供位元組序列的一般檢視。

這個解釋有點太籠統了,下面,我們來仔細的捋一下

1、什麼是位元組序列?

位元組序列指的是:位元組物件被儲存為連續的位元組序列,位元組按照一定的順序進行排序組成了位元組序列。

那麼關於流的解釋可以抽象為下列情況:

一條河中有一條魚游過,這條魚就是乙個位元組,這個位元組包括魚的眼睛、嘴巴、等組成8個二進位制,顯然這條河就是我們的核心物件:流

下面我們來認識一下c#中的stream是如何使用的吧。

二、stream類的結構,屬性和相關方法

1、建構函式:

stream類有乙個protected型別的建構函式,但是他是個抽象類,無法直接使用new來例項化。所以我們自定義乙個流繼承自stream,看看哪些屬性必須重寫或自定義:

1

public

class

mystreamexample : stream 27

}89public

override

bool

canseek

1012}13

14public

override

bool

canwrite

1517}18

19public

override

void

flush()

2023

24public

override

long

length

2527}28

29public

override

long

position

3035

set3639}

4041

public

override

int read(byte buffer, int offset, int

count)

4245

46public

override

long seek(long

offset, seekorigin origin)

4750

51public

override

void setlength(long

value)

5255

56public

override

void write(byte buffer, int offset, int

count)

5760 }

可以看出系統自動幫我們實現了stream的抽象屬性和屬性方法

(1)canread:唯讀屬性,判斷該流是否能夠讀取;

(2)canseek:唯讀屬性,判斷該流是否支援跟蹤查詢;

(3)canwrite:唯讀屬性,判斷當前流是否可寫;

(4)void flush():當我們使用流寫檔案時,資料流會先進入到緩衝區中,而不會立刻寫入檔案,當執行這個方法後,緩衝區的資料流會立即寫入基礎流。

(5)length:流的長度;

(6)position:表示流中的乙個位置。

(7)abstract int read(byte buffer,int offset,int count)

這個方法包含了3個關鍵引數:緩衝位元組陣列,位偏移量和讀取位元組個數,每次讀取乙個位元組後會返回乙個緩衝區的總位元組數

第乙個引數:這個陣列相當於乙個空盒子,read() 方法每次讀取流中的乙個位元組,將其放進這個空盒子中(全部讀完後便可以使用buffer位元組陣列了)

第二個引數:表示位移偏量,告訴我們從流中哪個位置(偏移量)開始讀取。

第三個引數:就是讀取多少位元組數。

返回值:總共讀取了多少位元組數

如果offset為負,則要求 新位置位於origin制定的位置之前,其間隔相差offset制定的位元組數。如果offset為0,則要求新位置位於由origin指定的位置處。如果offset為正,則要求新位置位於origin制定的位置後,其間隔相差offset制定的位元組數。

stream.seek(-3,origin.end):表示在流末端往前第3個位置。

stream.seek(0,origin.begin):表示在流的開頭位置。

stream.seek(3,origin.current):表示在流的當前位置往後數第3個位置。

查詢之後會返回乙個流中的乙個新位置,其實說到這大家就能理解seek方法的精妙之處了吧。

(9)abstract void write(byte buffer,int offset,int count)

這個方法包含3個關鍵引數:緩衝位元組陣列,位移偏量和讀取位元組個數和read方法,不同的是write方法中的第乙個引數buffer已經有許多byte型別的資料,我們只需通過設定offset和count來將buffer中的資料寫入流中。

(10)virtual void close()

關閉流並釋放資源,在實際操作中,如果不用using的話,別忘了使用完流之後將其關閉。

1

static

void main(string

args)2"

, teststring);

13//

如果該流可寫

14if

(stream.canwrite)

15位置

",stream.position+1

);25

26//

從剛才結束的位置(當前位置)往後移3位,到第7位

27long newpositioninstream =stream.canseek? stream.seek(3, seekorigin.current):0;28

29 console.writeline("

重新定位後stream.postion在第位置

", newpositioninstream+1

);30

if (newpositioninstream

3135

3637

//寫完後將stream的position屬性設定成0,開始讀流中的資料

38 stream.position = 0;39

40//

設定乙個空的盒子來接收流中的資料,長度根據stream的長度來決定

41 readbuffer = new

byte

[stream.length];

4243

44//

設定stream總的讀取數量 ,

45//

注意!這時候流已經把資料讀到了readbuffer中

46int count = stream.canread?stream.read(readbuffer, 0, readbuffer.length):0;47

4849

//由於剛開始時我們使用加密encoding的方式,所以我們必須解密將readbuffer轉化成char陣列,這樣才能重新拼接成string

5051

//首先通過流讀出的readbuffer的資料求出從相應char的數量

52int charcount = encoding.default.getcharcount(readbuffer, 0

, count);

53//

通過該char的數量 設定乙個新的readchararray陣列

54 readchararray = new

char

[charcount];

55//

encoding 類的強悍之處就是不僅包含加密的方法,甚至將解密者都能建立出來(getdecoder()),

56//

解密者便會將readchararray填充(通過getchars方法,把readbuffer 逐個轉化將byte轉化成char,並且按一致順序填充到readchararray中)

57 encoding.default.getdecoder().getchars(readbuffer, 0, count, readchararray, 0

);58

for (int i = 0; i < readchararray.length; i++)

5962 console.writeline("

讀取的字串為:

", readstring);63}

6465

stream.close();66}

6768

console.readline();

6970 }

結果:

好了,關於流的基本介紹和概念,我們就分享到這裡。非常感謝 逆時針の風 的部落格對我的幫助

Stream概述以及建立Stream物件

stream是用來操作容器中的資料,例如過濾,對映,規約,排序,查詢記錄等等 stream是和cpu打交道 集合關注的是資料的儲存,是和記憶體打交道 總結 集合說的是資料,stream說的是計算 注意 stream 自己不會儲存元素 資料 資料仍然是在集合當中。類似於迭代器,迭代器是用來遍歷集合的,...

Stream基礎篇 Stream入門應用

分割槽是有狀態處理中的乙個關鍵概念,無論是效能還是一致性的原因,分割槽都是至關重要的,當生產者將訊息資料傳送給多個消費者例項時,保證擁有共同特徵的訊息資料始終是由同乙個消費者例項接收和處理。例如,在時間窗平均計算示例中,來自任何給定感測器的所有測量值都由相同應用程式例項處理是很重要的。注 要設定分割...

關於stream 和lambda使用

這幾天看專案用到了這些,總結學習一下 先生成測試資料 liststudents new arraylist students.add student.builder name wyp id 1l age 21 男 build students.add student.builder name wj ...