流是C#中比較重要的一個概念,很多關鍵技術都需要用到流。何為流呢?可以了解流為江河中水的流動,不過C#中則為資訊流,我們可以把資訊寫入流,也可以讀出。比如以檔案讀寫操作為例,首先以某種方式(如隻讀)打開檔案,相當于建立了通往此檔案的流,然後就可以從此流中讀取資訊。C# stream為抽象類,隻能用來定義。由它派生出三個派生類:MemoryStream(記憶體流),BufferedStream(緩存流)以及filestream(檔案流)。以下例子由http://www.2cto.com/kf/201203/123535.html轉載而來,并且此例子有更加詳細的說明。本例子由memorystream進行構造,此類進行資料讀取格式為byte類型,中間需要用到相關轉化(encoding類),其實流的操作均為byte類型,采用不同的reader,可以簡化操作,此例子以memorystream的write,read方法來進行相關操作。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
namespace StreamStu
{
class Program
{
static void Main(string[] args)
{
//本節主講stream的用法
//通過二進制把,資料讀入流,并讀出流
string testStr = "Stream!Hello world";//讀入的資料(字元串)
byte[] buffer = null;//中間資料傳輸用的緩沖位元組數組
byte[] readBuffer = null;//讀取資料的緩沖位元組數組
char[] readArr;//解碼出char的緩沖字元數組
string stringArr = string.Empty;//存放解碼出的string
//開始檔案的讀入;
Console.WriteLine("初始字元串為:" + testStr);
using (Stream stream = new MemoryStream())
{
if (stream.CanWrite)//判斷目前流是否可寫入
{
//資料寫入
buffer = Encoding.Default.GetBytes(testStr);
stream.Write(buffer, 0, 3);//從stream.position=0的位置讀入三個值,新的位置位于3+1的位置;
long newStreamPos = stream.CanSeek ? stream.Seek(3, SeekOrigin.Current) : 0;//讀取位置從目前為位置偏移3;
if ((int)newStreamPos < buffer.Length)//判斷移動位置是否超出總長度;
{
stream.Write(buffer, (int)newStreamPos, buffer.Length - (int)newStreamPos);
}
}
stream.Position = 0;//讀取時,初始位置設為0
readBuffer = new byte[buffer.Length];
int count = stream.CanRead ? stream.Read(readBuffer, 0, buffer.Length) : 0;//從流中讀入readbuffer,read傳回值為讀入的個數,write無傳回值
//将readbuffer轉換為string
int charCount = Encoding.Default.GetCharCount(readBuffer, 0, count);//确定解碼的字元個數,即readbuffer中,從0開始,解碼count個
readArr = new char[charCount];
Encoding.Default.GetDecoder().GetChars(readBuffer, 0, count, readArr, 0);//從readbuffer中0位置開始解碼,解碼count個到readarr,并從readarr的0位置開始寫入
for (int i = 0; i < readArr.Length; i++)
{
stringArr += readArr[i];
}
stream.Close();
}
Console.WriteLine(stringArr);
Console.ReadKey();
}
}
}
其實進行資料讀取時,可以用streamReader,可以省略将byte資料轉化成char[]進而轉化成string的操作,代碼如下:
//用streamreader方法資料讀取
//stream.Position = 0;//讀取時,初始位置設為0
//StreamReader sr = new StreamReader(stream);
//string str = sr.ReadToEnd();
//Console.WriteLine(str);
可以直接讀取出string來。
本文代碼示例屬于轉載,此例子是一個不錯的基礎例子,值得反複思考,有問題一起讨論