C MemoryStream類案例詳解

2022-09-26 01:09:08 字數 4431 閱讀 9568

memorystream位於system.io命名空間,為系統記憶體提供流式的讀寫操作。常作為其他流資料交換時的中間物件操作。

memorystream 是乙個特例,memorystream中沒有任何非託管資源,所以它的dispose不呼叫也沒關係。託管資源.net會自動**

memorystream繼承自stream類。記憶體流的好處是指標可以晃來晃去,也就是支canseek,position,seek()。任意讀其中一段。

uoivtlfz在記憶體流中有必要了解一下seekorigin列舉

列舉成員

成員值描述

begin

0指定流的開頭。

current

1指定流內的當前位置。

end2

指定流的結尾。

memorystream提供的屬性與方法:

canread     已重寫。獲取乙個值,該值指示當前流是否支援讀取。

canseek     已重寫。獲取乙個值,該值指示當前流是否支援查詢。

cantimeout    獲取乙個值,該值確定當前流是否可以超時。(從 stream 繼承。)

canwrite     已重寫。獲取乙個值,該值指示當前流是否支援寫入。

capacity     獲取或設定分配給該流的位元組數。 這個是分配的位元組數

length      已重寫。獲取用位元組表示的流長度。這個是真正占用的位元組數。

position      已重寫。獲取或設定流中的當前位置。

readtimeout   獲取或設定乙個值,該值確定流在超時前嘗試讀取多長時間。 (從 stream 繼承。)

writetimeout   獲取或設定乙個值,該值確定流在超時前嘗試寫入多長時間。 (從 stream 繼承。)

beginread     開始非同步讀操作。 (從 stream 繼承。)

beginwrite    開始非同步寫操作。 (從 stream 繼承。)

close        關閉當前流並釋放與之關聯的所有資源(如套接字和檔案控制代碼)。 (從 stream 繼承。)

createobjref   建立乙個物件,該物件包含生成用於與遠端物件進行通訊的**所需的全部相關資訊。 (從 marshalbyrefobject 繼承。)

dispose      已過載。

endread     等待掛起的非同步讀取完成。 (從 stream 繼承。)

endwrite      結束非同步寫操作。 (從 stream 繼承。)

flush        已重寫。 重寫 stream.flush 以便不執行任何操作。

getbuffer     返回從其建立此流的無符號位元組陣列。 是會返回所有分配的位元組,不管用沒用到。

getlifetimeservice      檢索控制此例項的生存期策略的當前生存期服務物件。 (從 marshalbyrefobject 繼承。)

initializelifetimeservice   獲取控制此例項的生存期策略的生存期服務物件。 (從 marshalbyrefobject 繼承。)

read            已重寫。 從當前流中讀取位元組塊並將資料寫入 buffer 中。 搞了好久才弄明白read()方法的含義,第乙個引數,是讀取到的內容要輸出到的位元組陣列,第二個引數是放在第乙個引數即要輸出的陣列的位置的偏移量,第三個引數是,要讀取的字元數。 用這個方法你可以任意讀取一段需要的記憶體。注意,read()方法是從當前流的position屬性的位置開始讀,這就是為什麼很多人測試的時候,剛剛寫入記憶體的資料,read()方法無法讀取到內容的原因,因為剛剛寫入記憶體之後,位置恰好是在最後一位了。read()方法當然讀不到。此方法強大之處在於,你可以從乙個記憶體流中讀出你想要的乙個片段。

readbyte          已重寫。 從當前流中讀取乙個位元組。

seek            已重寫。 將當前流中的位置設定為指定值。

setlength          已重寫。 將當前流的長度設為指定值。

synchronized        在指定的 stream 物件周圍建立執行緒安全(同步)包裝。 (從 stream 繼承。)

toarray          將整個流內容寫入位元組陣列,而與 position 屬性無關。

write            已重寫。 使用從緩衝區讀取的資料將位元組塊寫入當前流。 同樣注意下,第二個引數是第乙個引數陣列的偏移量就可以了。

writebyte         已重寫。 將乙個位元組寫入當前流中的當前位置。

writeto          將此記憶體流的整個內容寫入另乙個流中。

以下給出使用示例**:

static void main(string args)

memorystream ms2 = new memorystream();

byte bytes6 = encoding.utf8.getbytes("abcde");

ms2.write(bytes6, 0, bytes6.length);

console.writeline(ms2.position); //輸出5 寫完之後流的位置就到了最後,因此想用read讀取必須加下面這一行**。

程式設計客棧 seekorigin.begin); //想要用read方法讀取完整的流,必須設定當前位置,read是從position的位置開始讀。

ms2.position = 0; //read是從當前位置開始讀,這行**和上面一行意義一樣。

byte bytearray = new byte[5] ; //99是經過ytf8解碼之後是 n

ms2.read(bytearray, 2, 1); //讀取乙個位元組,bytearray的第乙個元素中,(注意從0開始)

console.writeline(encoding.utf8.getstring(bytearray)); //nnann

2, 2);

//nnabn //當超出接收陣列總長度的時候,後面的元素會被移開

//設定當前流的長度

console.writeline(ms.length); //輸出9 當前流的長度是9

ms.setlength(20);

cons程式設計客棧ole.writeline(ms.length); //輸出20

foreach (byte b in ms.toarray()) //將流的內容也就是記憶體中的內容轉換位元組陣列

console.writeline(encoding.utf8.getstring(ms.toarray())); //輸出 abcdedcba 雖然長度變長了,但是沒影響讀取資料

memorystream ms1 = new memorystream();

byte bytes4 = ms1.toarray();

console.writeline("此記憶體流並沒有寫入資料(write)" + encoding.utf8.getstring(bytes4));//輸出 此記憶體流並沒有寫入資料(write) 因為記憶體為空

//下面來乙個指定位置的寫入

memorystream ms3 = new memorystream();

byte bytesarr = encoding.ascii.getbytes("abcdefg");

ms3.write(bytesarr, 0, bytesarr.length);

ms3.position = 2;

ms3.writebyte(97); //97代表的是a 這段**的意思是,將原先第二個的c替換為a

string str = encoding.ascii.getstring(ms3.toarray());

console.writeline(str); //輸出 abacdefg

byte bytearr1 = encoding.ascii.getwww.cppcns.combytes("kk");

ms3.position = 4;

ms3.write(bytearr1, 0, bytearr1.length);

console.writeline(encoding.utf8.getstring(ms3.toarray())); //abadkkg //從第4位替換掉了兩個位元組為kk

console.readkey();

}接下來實現資料類的轉換:

using system.io;

using system.runtime.serialization;

using system.runtime.serwww.cppcns.comialization.formatters.binary;

public class dataswitch

}///

/// 位元組流轉成資料類物件

///

///

///

public static object bytestoobject(byte bytes)}}

python類方法的綜合應用案列

以下是我對類的一些思考,希望可以幫助大家啊 為類calendar新增兩個方法 乙個刪除完成項,乙個新增新增項 a code block 題目要就 刪除 給父母買禮物鍵值對,並新增 寫日記 20 00 class calendar def init self self.date 2020 08 08 ...

SpringData MongoDB 入門案例

建立工程,引入座標 org.springframework.data spring data mongodb 2.2.1.release junit junit 4.12 org.springframework spring test 5.1.6.release 建立配置檔案 建立實體類 使用 do...

SQL IDENTITY INSERT作用案例詳解

一般情況下,當資料表中,莫一列被設定成了標識列之後,是無法向標識列中手動的去插入標識列的顯示值。但是,可以通過設定set identity insert屬性來實現對標識列中顯示值的手動插入。寫法 注意 identity insert的開啟on和關閉off是成對出現的,所以,在執行完手動插入操作之後,...