編程訪問檔案是通過檔案流對象進行的,當應用程式需要訪問檔案時,必須先建立一個檔案流對象,此流對象和檔案是一一對應關係。
在.NET中,使用抽象基類System.IO.Stream代表流,它提供Read和Write兩個方法。由於資料流的有序性,因此流對象還有一個讀寫指標,為此,Stream類還有一個Seek方法用於移動讀寫指標。
FileStream對象的資料來自檔案,而MemoryStream對象的資料來自記憶體緩衝區。這兩個類都繼承自Stream類。
MemoryStream的資料來自記憶體中的一塊連續地區,這塊地區稱為“緩衝區(Buffer)”。可以把緩衝區看成一個數組,每個數組元素可以存放一個位元組的資料。
在建立MemoryStream對象時,可以指定緩衝區的大小,並且可以在需要的時候更改。
//位元組數組
byte[] buffer = new byte[600];
//填充位元組數組
private void CreateExampleData()
{
for(int i=0; i<600; i++)
{
//byte類型的數最大不能超過255,用256模數實現
buffer[i] = (byte)(i%256);
}
}記憶體流的基本使用方法:
private void OnTestMemory()
{
//建立測試資料
CreateExampleData();
//建立記憶體流對象,初始分配50位元組的緩衝區
MemoryStream mem = new MemoryStream(50);
//向記憶體流中寫入位元組數組的所有資料
mem.Write(buffer,0,buffer.GetLength(0));
MessageBox.Show("寫入資料後的記憶體流長度:" + mem.Length.ToString());
MessageBox.Show("分配給記憶體流的緩衝區大小:" + mem.Capacity.ToString());
mem.SetLength(550);
MessageBox.Show("調用SetLength方法後的記憶體流長度:" + mem.Length.ToString());
mem.Capacity = 620;//此值不能小於Length屬性
MessageBox.Show("調用Capacity方法後緩衝區大小:" + mem.Capacity.ToString());
//將讀寫指標移到距流開頭10個位元組的位置
mem.Seek(10,SeekOrigin.Begin);
MessageBox.Show(mem.ReadByte().ToString());
mem.Close();
}記憶體流的Length屬性代表了其中存放的資料的真實長度,而Capacity屬性則代表了分配給記憶體流的記憶體空間大小。
可以使用位元組數組建立一個固定大小的MemoryStream,
MemoryStream mem = new MemoryStream(buffer);這時,無法再設定Capacity屬性的大小。
還可以建立唯讀記憶體流對象。
MemoryStream mem = new MemoryStream(buffer,false);
FlieStream用於存取檔案。
建立檔案並寫入內容:
//建立一個新檔案
FileStream fsForWrite = new FileStream("test.data",FileMode.Create);
try
{
//寫入一個位元組
fsForWrite.WriteByte(100);
CreateExampleData();
//將位元組數組寫入檔案
fsForWrite.Write(buffer,0,buffer.GetLength(0));
}
catch(Exception ex)
{
MessageBox.Show(ex.Message);
}
finally
{
//關閉檔案
fsForWrite.Close();
}開啟檔案並讀取內容:
private void ReadFromFile()
{
FileStream fsForRead = new FileStream("test.data",FileMode.Open);
try
{
//讀入一個位元組
MessageBox.Show("檔案的第一個位元組為:"+fsForRead.ReadByte().ToString());
//讀寫指標移到距開頭10個位元組處
fsForRead.Seek(10,SeekOrigin.Begin);
byte[] bs = new byte[10];
//從檔案中讀取10個位元組放到數組bs中
fsForRead.Read(bs,0,10);
}
catch(Exception ex)
{
MessageBox.Show(ex.Message);
}
finally
{
fsForRead.Close(); }
}如果一個程式退出了,但它開啟的檔案沒有被關閉,將導致其他程式無法修改或刪除此檔案。