程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#基礎知識 >> C#的Stream流總結

C#的Stream流總結

編輯:C#基礎知識
本篇文章簡單總結了在C#編程中經常會用到的一些流。比如說FileStream、MemoryStream、 BufferedStream、 NetWorkStream、 StreamReader/StreamWriter、 TextReader/TextWriter等的簡單用法。

內容

一 FileStream類

FileStream類主要用於讀取磁盤上的文件或者向磁盤文件寫入信息。有時,我們需要將程序中的一些數據存儲到磁盤上或是讀取配置文件中某些內容,在這裡我們就會用該類。

從磁盤上的文件中讀取內容:

FileStream file = File.Open(@"F:\file.txt", FileMode.Open); //初始化文件流
byte[] array = new byte[file.Length];//初始化字節數組
file.Read(array, 0, array.Length);//讀取流中數據把它寫到字節數組中
file.Close();//關閉流
string str = Encoding.Default.GetString(array);//將字節數組內容轉化為字符串
Console.WriteLine(str);
  將數據寫入磁盤文件:

FileStream file = File.Open(@"F:\file.txt", FileMode.Append);//初始化文件流
byte[] array = Encoding.UTF8.GetBytes("Hello World!你好");//給字節數組賦值
file.Write(array, 0, array.Length);//將字節數組寫入文件流
file.Close();//關閉流
二 MemoryStream類

MemoryStream類主要用於操作內存中的數據。比如說網絡中傳輸數據時可以用流的形式,當我們收到這些流數據時就可以聲明MemoryStream類來存儲並且處理它們。

MemoryStream操作字符串:

string str = "Hi!你好!";
byte[] array = Encoding.UTF8.GetBytes(str);//將字符串轉化為字節數組
MemoryStream memory = new MemoryStream(array);//初始化MemoryStream類
byte[] arrayNew = memory.ToArray();//將內存中的數據轉換為字節數組
string strNew = Encoding.UTF8.GetString(arrayNew);//將字節數組轉換為字符串
三 BufferedStream類

BufferedStream類主要也是用來處理流數據的,但是該類主要的功能是用來封裝其他流類。為什麼要封裝其他流類,這麼做的意義是什麼?按照微軟的話說主要是減少某些流直接操作存儲設備的時間。對於一些流來說直接向磁盤中存儲數據這種做法的效率並不高,用BufferedStream包裝過的流,先在內存中進行統一的處理再向磁盤中寫入數據,也會提高寫入的效率。

將磁盤上的一個文件寫入到磁盤上的另一個文件中:

BufferedStream封裝流
FileStream file1 = File.Open(@"F:\file1.txt", FileMode.OpenOrCreate,FileAccess.Read);//讀取文件流
FileStream file 2= File.Open(@"F:\file2.txt", FileMode.OpenOrCreate,FileAccess.Write);//寫入文件流

byte[] array = new byte[4096];

BufferedStream bufferedInput = new BufferedStream(file1);//封裝文件流
BufferedStream bufferedOutput = new BufferedStream(file2);//封裝文件流

bufferedInput.Read(array, 0, array.Length);
bufferedOutput.Write(array, 0, array.Length);

int bytesRead = 0;
while ((bytesRead = bufferedInput.Read(array, 0, 4096)) > 0)//讀取到了數據
{
bufferedOutput.Write(array, 0, bytesRead);
Console.WriteLine(bytesRead);
}
bufferedInput.Close();//關閉各種流
bufferedOutput.Close();
file1.Close();
file2.Close();
  實際測試中,封裝流的方法在效率上並沒有太多的提升。使用其他流也可以封裝文件流。如果想要保證不頻繁的讀取磁盤其實只要保證代碼不這樣做就可以了,所以其實在代碼上多加控制,也能保證程序不會經常的操作磁盤。
何問起
四 NetWorkStream類

NetWorkStream類是專門用來處理服務器與客戶端通信的流。它在網絡編程中經常使用,主要是用來處理類似Socket、TcpClient和TcpListener這些類中得到的流。

簡單的TCP同步方式服務器與客戶端通信:

服務器
TcpListener lis=new TcpListener(5000); //服務器監聽
lis.Start();//啟動
Socket sock=lis.AcceptSocket();//阻塞,直到有客戶端連接

NetworkStream networkStream = new NetworkStream(sock);//得到Socket中的流
if (netStream.DataAvailable) //如果客戶端發送了消息
{
byte[] data = new byte[1024]; //定義一個字節數組,用來存放接收的數據
int len = netStream.Read(data, 0, data.Length); //從位置開始,讀取到字節數組末尾
string line = Encoding.Default.GetString(data, 0, len); //把收到的字節轉換為字符串
}
客戶端
TcpClient client = new TcpClient();//客戶端tcp對象
client.Connect("127.0.0.1", 5000);//連接服務器
NetworkStream myStream = client.GetStream();//得到網絡流

byte[] data = Encoding.Default.GetBytes("Hi,你好"); //首先把輸入的字符串消息轉換為字節
myStream .Write(data, 0, data.Length); //向myStream 裡寫入數據
myStream .Flush(); //刷新流中的數據
myStream .Close();

// hovertree.com
五 StreamReader/StreamWriter類

StreamReader/StreamWriter主要用來處理流數據。它們分別提供了高效的流讀取/寫入功能。

讀取與寫入:

StreamReader/Writer讀寫
StreamReader reader = new StreamReader("filePath");//初始化讀取
StreamWriter writer = new StreamWriter("filePath");//初始化寫入

string readStr=reader.ReadLine();//從流中讀取一行
string readAff = reader.ReadToEnd();//從流中讀取全部

writer.Write("Hi 你好");//寫入內容
writer.WriteLine("Hi 你好");//寫入一行

reader.Close();//關閉流
writer.Close();
六 TextReader/TextWriter類

TextReader/TextWriter類主要用來處理流數據。它們分別提供了高效的文本流讀取/寫入功能。

讀取與寫入:

TextReader/Writer讀寫
TextReader textReader = new StringReader("Hi 你好");//初始化讀取流
TextWriter textWriter = new StringWriter();//初始化寫入流

char[] c=new char[4096];
int chars = 0;
while ((chars = textReader.Read(c, 0, 4096)) > 0)//把流中數據寫入到字符數組中
{
textWriter.Write(c, 0, 4096);//從字符數組中讀取流
}

string str= textWriter.ToString();//將流中數據寫到字符串中
textReader.Close();//關閉流
textWriter.Close();
注意事項:

1.流使用後必須要關閉。

2.把流中數據加載到內存時要考慮內存溢出等問題。
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved