亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C# > 正文

.Net筆記:System.IO之Stream的使用詳解

2020-01-24 03:18:23
字體:
來源:轉載
供稿:網友
Stream在msdn的定義:提供字節序列的一般性視圖(provides a generic view of a sequence of bytes)。這個解釋太抽象了,不容易理解;從stream的字面意思“河,水流”更容易理解些,stream是一個抽象類,它定義了類似“水流”的事物的一些統一行為,包括這個“水流”是否可以抽水出來(讀取流內容);是否可以往這個“水流”中注水(向流中寫入內容);以及這個“水流”有多長;如何關閉“水流”,如何向“水流”中注水,如何從“水流”中抽水等“水流”共有的行為。
常用的Stream的子類有:
1) MemoryStream 存儲在內存中的字節流
2) FileStream  存儲在文件系統的字節流
3) NetworkStream 通過網絡設備讀寫的字節流
4) BufferedStream 為其他流提供緩沖的流
Stream提供了讀寫流的方法是以字節的形式從流中讀取內容。而我們經常會用到從字節流中讀取文本或者寫入文本,微軟提供了StreamReader和StreamWriter類幫我們實現在流上讀寫字符串的功能。
下面看下如何操作Stream,即如何從流中讀取字節序列,如何向流中寫字節
1. 使用Stream.Read方法從流中讀取字節,如下示例注釋:
復制代碼 代碼如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
namespace UseStream
{
    class Program
    {
        //示例如何從流中讀取字節流
        static void Main(string[] args)
        {
            var bytes = new byte[] {(byte)1,(byte)2,(byte)3,(byte)4,(byte)5,(byte)6,(byte)7,(byte)8};
            using (var memStream = new MemoryStream(bytes))
            {
                int offset = 0;
                int readOnce = 4;
                do
                {
                    byte[] byteTemp = new byte[readOnce];
                    // 使用Read方法從流中讀取字節
                    //第一個參數byte[]存儲從流中讀出的內容
                    //第二個參數為存儲到byte[]數組的開始索引,
                    //第三個int參數為一次最多讀取的字節數
                    //返回值是此次讀取到的字節數,此值小于等于第三個參數
                    int readCn = memStream.Read(byteTemp, 0, readOnce);
                    for (int i = 0; i < readCn; i++)
                    {
                        Console.WriteLine(byteTemp[i].ToString());
                    }

                    offset += readCn;

                    //當實際讀取到的字節數小于設定的讀取數時表示到流的末尾了
                    if (readCn < readOnce) break;
                } while (true);
            }
            Console.Read();
        }
    }
}

2. 使用Stream.BeginRead方法讀取FileStream的流內容
注意:BeginRead在一些流中的實現和Read完全相同,比如MemoryStream;而在FileStream和NetwordStream中BeginRead就是實實在在的異步操作了。
如下示例代碼和注釋:
復制代碼 代碼如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Threading;
namespace UseBeginRead
{
    class Program
    {
        //定義異步讀取狀態類
        class AsyncState
        {
            public FileStream FS { get; set; }

            public byte[] Buffer { get; set; }

            public ManualResetEvent EvtHandle { get; set; }
        }
        static  int bufferSize = 512;
        static void Main(string[] args)
        {
            string filePath = "d://test.txt";
            //以只讀方式打開文件流
            using (var fileStream = new FileStream(filePath, FileMode.Open, FileAccess.Read))
            {
                var buffer = new byte[bufferSize];

                //構造BeginRead需要傳遞的狀態
                var asyncState = new AsyncState { FS = fileStream, Buffer = buffer ,EvtHandle = new ManualResetEvent(false)};

                //異步讀取
                IAsyncResult asyncResult = fileStream.BeginRead(buffer, 0, bufferSize, new AsyncCallback(AsyncReadCallback), asyncState);

                //阻塞當前線程直到讀取完畢發出信號
                asyncState.EvtHandle.WaitOne();
                Console.WriteLine();
                Console.WriteLine("read complete");
                Console.Read();
            }
        }
        //異步讀取回調處理方法
        public static void AsyncReadCallback(IAsyncResult asyncResult)
        {
            var asyncState = (AsyncState)asyncResult.AsyncState;
            int readCn = asyncState.FS.EndRead(asyncResult);
            //判斷是否讀到內容
            if (readCn > 0)
            {
                byte[] buffer;
                if (readCn == bufferSize) buffer = asyncState.Buffer;
                else
                {
                    buffer = new byte[readCn];
                    Array.Copy(asyncState.Buffer, 0, buffer, 0, readCn);
                }

                //輸出讀取內容值
                string readContent = Encoding.UTF8.GetString(buffer);
                Console.Write(readContent);
            }

            if (readCn < bufferSize)
            {
                asyncState.EvtHandle.Set();
            }
            else {
                Array.Clear(asyncState.Buffer, 0, bufferSize);
                //再次執行異步讀取操作
                asyncState.FS.BeginRead(asyncState.Buffer, 0, bufferSize, new AsyncCallback(AsyncReadCallback), asyncState);
            }
        }
    }
}

3. 使用Stream.Write方法向流中寫字節數組
在使用Write方法時,需要先使用Stream的CanWrite方法判斷流是否可寫,如下示例定義了一個MemoryStream對象,然后向內存流中寫入一個字節數組
復制代碼 代碼如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
namespace UseStreamWrite
{
    class Program
    {
        static void Main(string[] args)
        {
            using (var ms = new MemoryStream())
            {
                int count = 20;
                var buffer = new byte[count];
                for (int i = 0; i < count; i++)
                {
                    buffer[i] = (byte)i;
                }

                //將流當前位置設置到流的起點
                ms.Seek(0, SeekOrigin.Begin);

                Console.WriteLine("ms position is " + ms.Position);

                //注意在調用Stream的Write方法之前要用CanWrite判斷Stream是否可寫
                if (ms.CanWrite)
                {
                    ms.Write(buffer, 0, count);
                }

                //正確寫入的話,流的位置會移動到寫入開始位置加上寫入的字節數
                Console.WriteLine("ms position is " + ms.Position);
            }

            Console.Read();
        }
    }
}

4. 使用Stream.BeginWrite方法異步寫;異步寫可以提高程序性能,這是因為磁盤或者網絡IO的速度遠小于cpu的速度,異步寫可以減少cpu的等待時間。
如下使用FileStream異步寫文件的操作示例
復制代碼 代碼如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Threading;
namespace UseStreamBeginWrite
{
    class Program
    {
        /// <summary>
        /// 異步回調需要的參數封裝類
        /// </summary>
        class AsyncState {
            public int WriteCountOnce { get; set; }
            public int Offset { get; set; }
            public byte[] Buffer { get; set; }
            public ManualResetEvent WaitHandle { get; set; }
            public FileStream FS { get; set; }
        }
        static void Main(string[] args)
        {
            //準備一個1K的字節數組
            byte[] toWriteBytes = new byte[1 << 10];
            for (int i = 0; i < toWriteBytes.Length; i++)
            {
                toWriteBytes[i] = (byte)(i % byte.MaxValue);
            }
            string filePath = "d://test.txt";
            //FileStream實例
            using (var fileStream = new FileStream(filePath, FileMode.Create, FileAccess.ReadWrite, FileShare.Read))
            {
                int offset = 0;
                //每次寫入32字節
                int writeCountOnce = 1 << 5;
                //構造回調函數需要的狀態
                AsyncState state = new AsyncState{
                    WriteCountOnce = writeCountOnce,
                    Offset = offset,
                    Buffer = toWriteBytes,
                    WaitHandle = new ManualResetEvent(false),
                    FS = fileStream
                };

                //做異步寫操作
                fileStream.BeginWrite(toWriteBytes, offset, writeCountOnce, WriteCallback, state);

                //等待寫完畢或者出錯發出的繼續信號
                state.WaitHandle.WaitOne();
            }
            Console.WriteLine("Done");
            Console.Read();
        }
        /// <summary>
        /// 異步寫的回調函數
        /// </summary>
        /// <param name="asyncResult">寫狀態</param>
        static void WriteCallback(IAsyncResult asyncResult)
        {
            AsyncState state = (AsyncState)asyncResult.AsyncState;

            try
            {
                state.FS.EndWrite(asyncResult);
            }
            catch (Exception ex)
            {
                Console.WriteLine("EndWrite Error:" + ex.Message);
                state.WaitHandle.Set();
                return;
            }

            Console.WriteLine("write to " + state.FS.Position);
            //判斷是否寫完,未寫完繼續異步寫
            if (state.Offset + state.WriteCountOnce < state.Buffer.Length)
            {
                state.Offset += state.WriteCountOnce;
                Console.WriteLine("call BeginWrite again");
                state.FS.BeginWrite(state.Buffer, state.Offset, state.WriteCountOnce, WriteCallback, state);
            }
            else {
                //寫完發出完成信號
                state.WaitHandle.Set();
            }
        }
    }
}

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美专区在线播放| 欧美在线日韩在线| 亚洲电影成人av99爱色| 日韩免费在线观看视频| 亚洲在线www| 亚洲成人激情图| 1769国内精品视频在线播放| 久久人人看视频| 久久视频在线视频| 欧美在线一区二区三区四| 国产ts人妖一区二区三区| 亚洲一区二区三区视频播放| 亚洲欧美日韩国产成人| 国产在线视频一区| 亚洲人成电影网站色| 国产精品中文字幕在线观看| 日韩一区视频在线| 亚洲aⅴ男人的天堂在线观看| 国产精品91视频| 日韩中文字幕av| 亚洲欧美国产日韩天堂区| 欧美片一区二区三区| 精品国产一区二区三区久久狼黑人| 精品国产乱码久久久久久天美| 日韩欧美极品在线观看| 在线播放国产一区二区三区| 这里只有精品在线播放| 久久精品国产视频| 精品久久国产精品| 色香阁99久久精品久久久| 欧美成人午夜免费视在线看片| 久久久免费观看| 欧美大人香蕉在线| 色七七影院综合| 久久久久久久亚洲精品| 亚洲综合第一页| 国产不卡精品视男人的天堂| 国产视频综合在线| 欧美区二区三区| 亚洲色图欧美制服丝袜另类第一页| 久久99视频精品| 亚洲精品久久久久中文字幕欢迎你| 国产精品视频专区| 欧美精品国产精品日韩精品| 久久久久国产视频| 亚洲精品自在久久| 久久伊人精品天天| 日韩精品视频免费专区在线播放| 亚洲男人天堂视频| 亚洲综合在线中文字幕| 亚洲人成网站999久久久综合| 日韩黄色高清视频| 欧美高清在线观看| 欧美中文字幕在线观看| 欧美大片大片在线播放| 一本一本久久a久久精品综合小说| 一区二区三区视频观看| 欧美一区二区视频97| 91免费国产视频| 91理论片午午论夜理片久久| 亚洲最大成人免费视频| 成人性生交大片免费观看嘿嘿视频| 亚洲第五色综合网| 国产精品自产拍高潮在线观看| 日韩精品免费在线播放| 欧美色图在线视频| 亚洲va男人天堂| 大伊人狠狠躁夜夜躁av一区| 欧美日韩一区二区在线| 久久精品国产亚洲精品2020| 91性高湖久久久久久久久_久久99| 97精品一区二区视频在线观看| 国产精品久久久久久中文字| 成人激情视频小说免费下载| 中文字幕久热精品视频在线| 国产精自产拍久久久久久| 亚洲精品aⅴ中文字幕乱码| 九九热精品视频| 国产成人免费91av在线| 一个人看的www久久| 色综合影院在线| 亚洲精品一区在线观看香蕉| 亚洲一区二区三区成人在线视频精品| 国内精品美女av在线播放| 亚洲一区二区中文| 91天堂在线观看| 国产精品第100页| 国产成人激情视频| 久久久久免费精品国产| 国产精品视频精品视频| 国产视频亚洲精品| 日韩免费不卡av| 国产91精品久久久久久久| 日韩精品视频在线观看免费| 国产精品激情av在线播放| 国产欧美一区二区三区在线| 亚洲片在线资源| 日韩小视频网址| 日韩在线观看免费全| 91免费视频网站| 清纯唯美亚洲激情| 精品久久久久久久久久久久久| 亚洲美女www午夜| 国产成人精品综合| 97免费视频在线播放| 久久久精品视频成人| 国产日韩视频在线观看| 97精品国产97久久久久久免费| 欧美日韩xxx| 日韩电影在线观看永久视频免费网站| 亚洲欧美精品伊人久久| 久久精品小视频| 92看片淫黄大片欧美看国产片| 国产精品视频久| 国产成人免费av电影| 亚洲人成网站999久久久综合| 久久亚洲国产精品成人av秋霞| 国产精品久久久久久久久久三级| 久久人人爽人人爽人人片av高请| 国产精品久久久久久久久久免费| 久久久久久这里只有精品| 成人亚洲欧美一区二区三区| 97精品一区二区视频在线观看| 777午夜精品福利在线观看| 激情久久av一区av二区av三区| 色综合久久精品亚洲国产| 日韩暖暖在线视频| 久久精品亚洲一区| 情事1991在线| 亚洲精品国产欧美| 国产日韩精品综合网站| 亚洲欧美在线免费观看| 日本成熟性欧美| 国产亚洲视频在线观看| 欧美日韩国产综合新一区| 91精品国产91久久久久久久久| 成人在线精品视频| 久久全球大尺度高清视频| 亚洲a∨日韩av高清在线观看| 日韩精品免费在线视频| 国产国产精品人在线视| 97久久精品国产| 久久久久九九九九| 亚洲精品资源美女情侣酒店| 中文国产成人精品久久一| 久久夜精品香蕉| 欧美激情精品久久久久久免费印度| 日韩av中文字幕在线播放| 伊人青青综合网站| 色综合久综合久久综合久鬼88| 亚洲天堂精品在线| 亚洲日本中文字幕免费在线不卡| 亚洲欧美一区二区三区情侣bbw| 亚洲成人动漫在线播放| 伊人久久久久久久久久久久久| 欧美日韩免费观看中文| 欧美最猛性xxxxx亚洲精品| 久久五月天色综合| 欧美国产日韩精品| 视频在线观看99| 久久免费成人精品视频| 日本三级久久久| 国产成人高潮免费观看精品| 国产欧美精品一区二区三区介绍|