欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C# MemoryStream類案例詳解

 更新時間:2021年08月19日 15:58:46   作者:pan_junbiao  
這篇文章主要介紹了C# MemoryStream類案例詳解,本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下

MemoryStream位于System.IO命名空間,為系統(tǒng)內(nèi)存提供流式的讀寫操作。常作為其他流數(shù)據(jù)交換時的中間對象操作。

  1. MemoryStream類封裝一個字節(jié)數(shù)組,在構(gòu)造實例時可以使用一個字節(jié)數(shù)組作為參數(shù),但是數(shù)組的長度無法調(diào)整。使用默認無參數(shù)構(gòu)造函數(shù)創(chuàng)建實例,可以使用Write方法寫入,隨著字節(jié)數(shù)據(jù)的寫入,數(shù)組的大小自動調(diào)整。
  2. 在對MemoryStream類中數(shù)據(jù)流進行讀取時,可以使用seek方法定位讀取器的當前的位置,可以通過指定長度的數(shù)組一次性讀取指定長度的數(shù)據(jù)。ReadByte方法每次讀取一個字節(jié),并將字節(jié)返回一個整數(shù)值。
  3. UnicodeEncoding類中定義了Unicode中UTF-16編碼的相關(guān)功能。通過其中的方法將字符串轉(zhuǎn)換為字節(jié),也可以將字節(jié)轉(zhuǎn)換為字符串。

MemoryStream 是一個特例,MemoryStream中沒有任何非托管資源,所以它的Dispose不調(diào)用也沒關(guān)系。托管資源.Net會自動回收

MemoryStream繼承自Stream類。內(nèi)存流的好處是指針可以晃來晃去,也就是支CanSeek,Position,Seek()。任意讀其中一段。

在內(nèi)存流中有必要了解一下SeekOrigin枚舉

枚舉成員 成員值 描述
Begin 0 指定流的開頭。
Current 1 指定流內(nèi)的當前位置。
End 2 指定流的結(jié)尾。

MemoryStream提供的屬性與方法:

一、屬性

CanRead     已重寫。獲取一個值,該值指示當前流是否支持讀取。
CanSeek     已重寫。獲取一個值,該值指示當前流是否支持查找。
CanTimeout    獲取一個值,該值確定當前流是否可以超時。(從 Stream 繼承。)
CanWrite     已重寫。獲取一個值,該值指示當前流是否支持寫入。
Capacity     獲取或設(shè)置分配給該流的字節(jié)數(shù)。 這個是分配的字節(jié)數(shù)
Length      已重寫。獲取用字節(jié)表示的流長度。這個是真正占用的字節(jié)數(shù)。
Position      已重寫。獲取或設(shè)置流中的當前位置。
ReadTimeout   獲取或設(shè)置一個值,該值確定流在超時前嘗試讀取多長時間。 (從 Stream 繼承。)
WriteTimeout   獲取或設(shè)置一個值,該值確定流在超時前嘗試寫入多長時間。 (從 Stream 繼承。)

二、方法

BeginRead     開始異步讀操作。 (從 Stream 繼承。)
BeginWrite    開始異步寫操作。 (從 Stream 繼承。)
Close        關(guān)閉當前流并釋放與之關(guān)聯(lián)的所有資源(如套接字和文件句柄)。 (從 Stream 繼承。)
CreateObjRef   創(chuàng)建一個對象,該對象包含生成用于與遠程對象進行通信的代理所需的全部相關(guān)信息。 (從 MarshalByRefObject 繼承。)
Dispose      已重載。
EndRead     等待掛起的異步讀取完成。 (從 Stream 繼承。)
EndWrite      結(jié)束異步寫操作。 (從 Stream 繼承。)
Flush        已重寫。 重寫 Stream.Flush 以便不執(zhí)行任何操作。
GetBuffer     返回從其創(chuàng)建此流的無符號字節(jié)數(shù)組。 是會返回所有分配的字節(jié),不管用沒用到。
GetLifetimeService      檢索控制此實例的生存期策略的當前生存期服務(wù)對象。 (從 MarshalByRefObject 繼承。)
InitializeLifetimeService   獲取控制此實例的生存期策略的生存期服務(wù)對象。 (從 MarshalByRefObject 繼承。)
Read            已重寫。 從當前流中讀取字節(jié)塊并將數(shù)據(jù)寫入 buffer 中。 搞了好久才弄明白Read()方法的含義,第一個參數(shù),是讀取到的內(nèi)容要輸出到的字節(jié)數(shù)組,第二個參數(shù)是放在第一個參數(shù)即要輸出的數(shù)組的位置的偏移量,第三個參數(shù)是,要讀取的字符數(shù)。 用這個方法你可以任意讀取一段需要的內(nèi)存。注意,Read()方法是從當前流的Position屬性的位置開始讀,這就是為什么很多人測試的時候,剛剛寫入內(nèi)存的數(shù)據(jù),Read()方法無法讀取到內(nèi)容的原因,因為剛剛寫入內(nèi)存之后,位置恰好是在最后一位了。Read()方法當然讀不到。此方法強大之處在于,你可以從一個內(nèi)存流中讀出你想要的一個片段。
ReadByte          已重寫。 從當前流中讀取一個字節(jié)。
Seek            已重寫。 將當前流中的位置設(shè)置為指定值。
SetLength          已重寫。 將當前流的長度設(shè)為指定值。
Synchronized        在指定的 Stream 對象周圍創(chuàng)建線程安全(同步)包裝。 (從 Stream 繼承。)
ToArray          將整個流內(nèi)容寫入字節(jié)數(shù)組,而與 Position 屬性無關(guān)。
Write            已重寫。 使用從緩沖區(qū)讀取的數(shù)據(jù)將字節(jié)塊寫入當前流。 同樣注意下,第二個參數(shù)是第一個參數(shù)數(shù)組的偏移量就可以了。
WriteByte         已重寫。 將一個字節(jié)寫入當前流中的當前位置。
WriteTo          將此內(nèi)存流的整個內(nèi)容寫入另一個流中。

以下給出使用示例代碼:

static void Main(string[] args)
        {
            //屬性測試
            MemoryStream ms = new MemoryStream();
            Console.WriteLine(ms.CanRead);      //True  內(nèi)存流可讀
            Console.WriteLine(ms.CanSeek);      //True  內(nèi)存流支持查找,指針移來移去的查找
            Console.WriteLine(ms.CanTimeout);   //False 內(nèi)存流不支持超時
            Console.WriteLine(ms.CanWrite);     //True  內(nèi)存流可寫
 
            Console.WriteLine(ms.Capacity);     //0     分配給該流的字節(jié)數(shù)
            byte[] bytes = Encoding.UTF8.GetBytes("abcdedcba");
            ms.Write(bytes, 0, bytes.Length);   //已將一段文本寫入內(nèi)存
            Console.WriteLine(ms.Capacity);     //256   再次讀取為文本流分配的字節(jié)數(shù)已經(jīng)變成了256,看來內(nèi)存流是根據(jù)需要的多少來分配的
            Console.WriteLine(ms.Length);       //9    這個是流長度,通常與英文的字符數(shù)一樣,真正占用的字節(jié)數(shù)。
 
            Console.WriteLine(ms.Position);     //9    流當前的位置,該屬性可讀可設(shè)置
 
            //Console.WriteLine(ms.ReadTimeout);    由于流不支持超時,此屬性如果讀取或者設(shè)置的話會報錯
            //Console.WriteLine(ms.WriteTimeout);   由于流不支持超時,此屬性如果讀取或者設(shè)置的話會報錯
 
            //方法測試
            byte[] byte1 = ms.GetBuffer();          //返回無符號字節(jié)數(shù)組 差點被忽悠了,無符號字節(jié)數(shù)組 其實就是byte(0~255),有符號字節(jié)sbyte(-128~127)
            string str1 = Encoding.UTF8.GetString(byte1);
            Console.WriteLine(str1);    //輸出    abcdedcba
 
            ms.Seek(2, SeekOrigin.Current);    //設(shè)置當前流正在讀取的位置 為開始位置即從0開始
            //從內(nèi)存中讀取一個字節(jié)
            int i = ms.ReadByte();
            Console.WriteLine(i);                   //輸出99
            byte[] bytes3 = ms.ToArray();
            foreach (byte b in bytes3)
            {
                Console.Write(b + "-");//用于對比   輸出 97-98-99-100-101-100-99-98-97-   可以看到    0,1,2第二位剛好是99
            }
 
            MemoryStream ms2 = new MemoryStream();
            byte[] bytes6 = Encoding.UTF8.GetBytes("abcde");
            ms2.Write(bytes6, 0, bytes6.Length);
            Console.WriteLine(ms2.Position);    //輸出5 寫完之后流的位置就到了最后,因此想用read讀取必須加下面這一行代碼。 
 
            //ms2.Seek(0, SeekOrigin.Begin);    //想要用Read方法讀取完整的流,必須設(shè)置當前位置,Read是從Position的位置開始讀。
            ms2.Position = 0;                   //Read是從當前位置開始讀,這行代碼和上面一行意義一樣。
            byte[] byteArray = new byte[5] { 110, 110, 110, 110, 110 }; //99是經(jīng)過YTF8解碼之后是 n
            ms2.Read(byteArray, 2, 1);   //讀取一個字節(jié),byteArray的第一個元素中,(注意從0開始)
            Console.WriteLine(Encoding.UTF8.GetString(byteArray)); //nnann
            //ms2.Read(byteArray, 2, 2);
            //Console.WriteLine(Encoding.UTF8.GetString(byteArray)); //nnabn    //當超出接收數(shù)組總長度的時候,后面的元素會被移開
 
 
            //設(shè)置當前流的長度
            Console.WriteLine(ms.Length);   //輸出9   當前流的長度是9
            ms.SetLength(20);
            Console.WriteLine(ms.Length);   //輸出20
            foreach (byte b in ms.ToArray())    //將流的內(nèi)容也就是內(nèi)存中的內(nèi)容轉(zhuǎn)換字節(jié)數(shù)組
            {
                Console.Write(b + "-");     //輸出 97-98-99-100-101-100-99-98-97-0-0-0-0-0-0-0-0-0 由于設(shè)置了長度,因此空的自動補0
            }
            Console.WriteLine(Encoding.UTF8.GetString(ms.ToArray()));   //輸出    abcdedcba   雖然長度變長了,但是沒影響讀取數(shù)據(jù)
 
            MemoryStream ms1 = new MemoryStream();
            byte[] bytes4 = ms1.ToArray();
            Console.WriteLine("此內(nèi)存流并沒有寫入數(shù)據(jù)(Write)" + Encoding.UTF8.GetString(bytes4));//輸出    此內(nèi)存流并沒有寫入數(shù)據(jù)(Write)  因為內(nèi)存為空
 
 
            //下面來一個指定位置的寫入
            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.GetBytes("kk");
            ms3.Position = 4;
            ms3.Write(byteArr1, 0, byteArr1.Length);
            Console.WriteLine(Encoding.UTF8.GetString(ms3.ToArray()));  //abadkkg   //從第4位替換掉了兩個字節(jié)為KK
 
            Console.ReadKey();
        }

接下來實現(xiàn)數(shù)據(jù)類的轉(zhuǎn)換:

using System.IO;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;
 
public class DataSwitch
{
 
    /// <summary>
    /// 數(shù)據(jù)類對象轉(zhuǎn)成字節(jié)流
    /// </summary>
    /// <param name="obj"></param>
    /// <returns></returns>
    ///   //MemoryStream: 創(chuàng)建其支持存儲區(qū)為內(nèi)存的流。
        //IFormatter : 提供將序列化對象格式化的功能。
    public static byte[] ObjectToBytes(object obj)
    {
        using (MemoryStream ms = new MemoryStream())
        {
            // //以二進制格式將對象或整個連接對象圖形序列化和反序列化。
            IFormatter formatter = new BinaryFormatter();
            //把字符串以二進制放進memStream中
            formatter.Serialize(ms, obj);
            //返回從其創(chuàng)建此流的無符號字節(jié)數(shù)組。 是會返回所有分配的字節(jié),不管用沒用到。
            返回無符號字節(jié)數(shù)組 ,無符號字節(jié)數(shù)組 其實就是byte(0~255),有符號字節(jié)sbyte(-128~127)
            return ms.GetBuffer();
        }
    }
 
    /// <summary>
    /// 字節(jié)流轉(zhuǎn)成數(shù)據(jù)類對象
    /// </summary>
    /// <param name="bytes"></param>
    /// <returns></returns>
    public static object BytesToObject(byte[] bytes)
    {
        using (MemoryStream ms = new MemoryStream(bytes))
        { 
            // //以二進制格式將對象或整個連接對象圖形序列化和反序列化。
            IFormatter formatter = new BinaryFormatter();
            //把字符串以二進制放進memStream中
            return formatter.Deserialize(ms);
        }
    }
}

到此這篇關(guān)于C# MemoryStream類案例詳解的文章就介紹到這了,更多相關(guān)C# MemoryStream類內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • c# base關(guān)鍵字的具體使用

    c# base關(guān)鍵字的具體使用

    base關(guān)鍵字用于從派生類中訪問基類的成員,本文主要介紹了c# base關(guān)鍵字的具體使用,文中通過示例代碼介紹的非常詳細,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-03-03
  • .NET的深復(fù)制方法(以C#語言為例)

    .NET的深復(fù)制方法(以C#語言為例)

    深復(fù)制需要將對象實例中字段引用的對象也進行復(fù)制,在平時的編程工作中經(jīng)常要用到這種復(fù)制方式,下面以c#為例來演示一下方法。
    2016-10-10
  • C#實現(xiàn)加密exe文件

    C#實現(xiàn)加密exe文件

    這篇文章主要為大家詳細介紹了C#如何實現(xiàn)加密exe文件的功能,文中的示例代碼講解詳細,對我們學(xué)習(xí)C#有一定的幫助,感興趣的小伙伴可以跟隨小編一起了解一下
    2023-01-01
  • C#驗證身份證的函數(shù)

    C#驗證身份證的函數(shù)

    因做項目需要,參考網(wǎng)上資料寫了一個身份證驗證的C#方法,本方法是在VS2005[C/S] 下寫的。前面2個是網(wǎng)友們的實現(xiàn)方法,第三個才是項目中使用的哦,小伙伴們參考下吧。
    2015-05-05
  • WindowsForm移動一個沒有標題欄的窗口的方法

    WindowsForm移動一個沒有標題欄的窗口的方法

    這篇文章主要介紹了WindowsForm移動一個沒有標題欄的窗口的方法,文中講解非常細致,代碼幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下
    2020-07-07
  • C# 語音功能的實現(xiàn)方法

    C# 語音功能的實現(xiàn)方法

    最近看了一些資料,是c#實現(xiàn)語音功能的?,F(xiàn)在就簡單的講一下怎么實現(xiàn)。
    2013-03-03
  • C#設(shè)計模式之觀察者模式實例講解

    C#設(shè)計模式之觀察者模式實例講解

    這篇文章主要介紹了C#設(shè)計模式之觀察者模式實例講解,本文詳細講解了觀察者模式的定義、優(yōu)缺點、代碼實例等,需要的朋友可以參考下
    2014-10-10
  • C#線程間通信的異步機制

    C#線程間通信的異步機制

    這篇文章介紹了C#線程間通信的異步機制,文中通過示例代碼介紹的非常詳細。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-05-05
  • Unity貝塞爾曲線之美體驗

    Unity貝塞爾曲線之美體驗

    這篇文章主要帶大家體驗Unity貝塞爾曲線之美,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-10-10
  • C#中接口的顯式實現(xiàn)與隱式實現(xiàn)及其相關(guān)應(yīng)用案例詳解

    C#中接口的顯式實現(xiàn)與隱式實現(xiàn)及其相關(guān)應(yīng)用案例詳解

    最近在學(xué)習(xí)演化一款游戲項目框架時候,框架作者巧妙使用接口中方法的顯式實現(xiàn)來變相對接口中方法進行“密封”,增加實現(xiàn)接口的類訪問方法的“成本”,這篇文章主要介紹了C#中接口的顯式實現(xiàn)與隱式實現(xiàn)及其相關(guān)應(yīng)用案例,需要的朋友可以參考下
    2024-05-05

最新評論