Stream 是所有流的抽象基類。流是字節序列的抽象概念。
流涉及到的3個基本操作:
讀取流,讀取是指從流到數據結構(如字節數組)的數據傳輸。
寫入流,寫入是指從數據結構到流的數據傳輸。
流查找,查找是對流內的當前位置進行的查詢和修改。
常用的Stream的子類有:
1) MemoryStream 存儲在內存中的字節流
2) FileStream 存儲在文件系統的字節流
3) NetworkStream 通過網絡設備讀寫的字節流
4) BufferedStream 為其他流提供緩沖的流
文件流FileStream類
FileStream類繼承自Stream類,一個FileStream實例,代表一個文件流,用於對磁盤文件進行讀取、寫入、打開、關閉等操作。.net提供了多種獲取FileStream對象的方法,其中構造函數就有十余種,下面我們來看一下典型的構造函數及其參數的解釋:
public FileStream(string path, FileMode mode, FileAccess access);
參數說明:
1)path:指明文件所在的路徑信息;
2)mode:FileMode的枚舉值,表示文件打開或創建的方式,含義如下:
CreateNew:指定操作系統應創建新文件,如果文件已經存在,則引發IOException;
Create:指定操作系統應創建新文件,如果文件已經存在,它將被覆蓋;
Open:指定操作系統應打開現有文件,如果文件不存在,則引發FileNotFoundException;
OpenOrCreate:指定操作系統應打開文件,如果文件不存在,則創建新文件;
Truncate:指定操作系統應打開現有文件,文件一旦打開,就將截斷為零字節大小;
Append:打開先有文件並把Position設置至文件尾,如果文件不存在將創建新文件。Append只能同FileAccess.Write一起使用;
3)access是FileAccess的枚舉值,它控制對文件的訪問權限,含義如下:
Read:打開文件用於只讀;
Write:打開文件用於只寫;
ReadWrite:打開文件,用於讀寫;
除了FileStream類本身提供的構造函數外,System.IO命名空間下的File和FileInfo類也提供了創建FileStream對象的方法。其中OpenRead方法返回只讀文件流,OpenWrite方法返回只寫文件流。如:
FileStream fs=File.OpenRead(@"c:\file.txt");
FileStream的讀寫方法簽名:
public override int Read( byte[] array, //內存緩沖區,儲存從文件流中讀取的數據 int offset, //偏移量,array開始寫入數據的下標值 int count //從文件流中讀取的字節大小 ); public override void Write( byte[] array, //內存緩沖區,存儲了要寫入流的字節數據 int offset, // 從array的下標值開始取數據 int count //要寫入的字節數 );
使用示例:
try { //寫入 FileStream fileStream = new FileStream(@"d:\test.txt", FileMode.OpenOrCreate); byte[] content = Encoding.UTF8.GetBytes("我愛我家"); fileStream.Write(content, 0, content.Length); fileStream.Position = 0; //設置當前位置 content = Encoding.UTF8.GetBytes("我愛你家"); fileStream.Write(content, 0, content.Length); fileStream.Close(); //讀取 fileStream = new FileStream(@"d:\test.txt", FileMode.Open); content = new byte[fileStream.Length]; fileStream.Read(content, 0, content.Length); Console.WriteLine(Encoding.UTF8.GetString(content)); } catch (Exception ex) { Console.WriteLine(ex.Message); }
內存流 MemoryStream
和文件流不同,MemoryStream類表示的是保存在內存中的數據流,由內存流封裝的數據可以在內存中直接訪問。內存一般用於暫時緩存數據以降低應用程序對臨時緩沖區和臨時文件的需要。
既然字節數據也在內存中存儲,為什么還要引入內存流的概念呢?這是因為內存流和字節數組雖然都位於程序緩沖區,但是具有不同特性。內存流相對於字節數組而言,具有流特有的特性,並且容量可自動增長,在數據加密以及對長度不定的數據進行緩存等場合,使用內存流比較方便。
MemoryStream有多種構造函數,部分舉例如下:
- public MemoryStream();該構造函數初始分配的容量大小為0,隨着數據的不斷寫入,其容量可以不斷地自動擴展。
- public MemoryStream(byte[] buffer);根據字節數組buffer初始化,實例的容量大小規定為字節數組的長度。
- public MemoryStream(int capacity);容量固定為capacity。
MemoryStream實例
MemoryStream mem = new MemoryStream(); Console.WriteLine("初始分配的容量:"+mem.Capacity+" 初始使用量:"+mem.Length); byte[] content = Encoding.UTF8.GetBytes("我愛我家"); mem.Write(content, 0, content.Length); Console.WriteLine("初始分配的容量:" + mem.Capacity + " 初始使用量:" + mem.Length);
網絡流NetWorkStream
網絡流的意思是數據在網絡的各個位置之間是以連續的字節形式傳輸的,NetWorkStream只能用於面向連接的套接字。
對於NetWorkStream流,寫入操作是指從來源端內存緩沖區到網絡上的數據傳輸;讀取操作是從網絡上到接收端內存緩沖區的數據傳輸。
如需對NetWorkStream深入了解,請查閱相關資料。
參考:
http://www.cnblogs.com/gavin-num1/p/5190312.html
其它相關:
1)從文件讀取文本
通過使用 ReadAllLines 或 ReadAllText 方法也可以實現此功能。
using System; using System.IO; public class TextFromFile { private const string FILE_NAME = "MyFile.txt"; public static void Main(String[] args) { if (!File.Exists(FILE_NAME)) { Console.WriteLine("{0} does not exist.", FILE_NAME); return; } using (StreamReader sr = File.OpenText(FILE_NAME)) { String input; while ((input=sr.ReadLine())!=null) { Console.WriteLine(input); } Console.WriteLine ("The end of the stream has been reached."); sr.Close(); } }