轉自:http://www.oseye.net/user/kevin/blog/85
一、文件流 FileStream
FileStream流繼承與Stream類,一個FileStream類的實例實際上代表一個文件流,使用FileStream類可以對文件系統上是文件進行讀取、寫入、打開和關閉操作。
創建FileStream實例
1、.Net提供多種獲取FileStream對象的方法,其中構造函數就有10多種,我們看下典型的構造函數順便講解下參數含義:
- public FileStream(string path, FileMode mode, FileAccess access);
參數說明:
path指明文件所在的路徑信息;
mode是FileMode的枚舉值,表示文件打開或創建的方式,含義如下:
- CreateNew:指定操作系統應創建新文件,如果文件已經存在,則引發IOException;
- Create:指定操作系統應創建新文件,如果文件已經存在,它將被覆蓋;
- Open:指定操作系統應打開現有文件,如果文件不存在,則引發FileNotFoundException;
- OpenOrCreate:指定操作系統應打開文件,如果文件不存在,則創建新文件;
- Truncate:指定操作系統應打開現有文件,文件一旦打開,就將截斷為零字節大小;
- Append:打開先有文件並把Position設置至文件尾,如果文件不存在將創建新文件。Append只能同FileAccess.Write一起使用;
access是FileAccess的枚舉值,它控制對文件的訪問權限,含義如下:
- Read:打開文件用於只讀;
- Write:打開文件用於只寫;
- ReadWrite:打開文件,用於讀寫;
2、除了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 //要寫入的字節數 );
FileStream實例
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實例
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深入了解,請查閱相關資料。
