FileStream對象表示在磁盤或網絡路徑上指向文件的流。當類提供向文件讀寫字節的方法時,經常使用StreamReader或StreamWriter執行這些功能。這是因為FileStream類操作字節和字節數組,而Stream類操作字符數據。字符數據易於使用,但是有些操作比如隨機文件訪問,就必須由FileStream對象執行。
FileStream對象的構造函數:
FileStream aFile = new FileStream(“Log.txt”,FileMode.OpenOrCreate);
FileMode枚舉具有幾種成員:
Append------如果文件存在,就打開文件,將文件位置移動到文件的末尾,並創建一個新文件。FileMode.Append僅可以與枚舉Fileaccess.Write聯合使用
Create------創建新文件;如果存在這樣的文件,就破壞它。
CreateNew------創建新文件,但是如果已經存在此文件,則拋出異常
Open------打開現有的文件,但是不存在所指定的文件,則拋出異常
OpenOrCreate------如果文件存在,則規定打開文件,否則就創建新文件,如果文件已經存在,則保留在文件中的數據
Truncate------打開現有文件,清除其內容,然后我們可以向文件寫入全新的數據,但是保留文件的初始創建日期,必須存在有文件,否則就拋出異常
訪問級別
前面的構造函數默認以只讀模式打開文件,需要一個附加參數規定不同的訪問級別,此參數是FileAccess參數。
FileStream aFile=new FileStream(”Log.txt”,fileMode.OpenOrCreate,FileAccess.Write)
FileAccess枚舉有三種類型:Read、Write、ReadWrite.此屬性的作用是:基於用戶的身份驗證級別改變用戶對文件的訪問
讀取文件的位置用seek:public long Seek(long offset,SeekOrigin origin)
Long offset是規定文件指針以字節為單位的移動距離;SeekOrigin origin是規定開始計算的起始位置,此枚舉包含3個值:Begin,Current和End。
例:aFile.Seek(8,SeekOrigin.Begin);// SeekOrigin.Begin指得是文件指針從文件的第一個字節起;而參數‘8‘指得是移動到文件的第8個字節
例2:afile.Seek(2,SeekOrigin.Current)//在當前位置開始,再移動2個字節。
例3:aFile.Seek(-5,SeekOrigin.End)//在文件末端位置開始,倒數5個字節。
讀取數據
使用FileStream類讀取數據不像使用StreamReader和StreamWriter類讀取數據那么容易,這是因為FileStream類只能處理原始字節(raw byey),這使得FileStream類可以用於任何數據文件,而不僅僅是文本文件,通過讀取字節數據就可以讀取類似圖像和聲音的文件。這種靈活性的代價是不能使用它直接讀入字符串,而使用StreamWriter和StreaMeader類卻可以這樣處理,從是有幾種轉換類可以很容易地將字節數組轉換為字符數組,或者進行相反的操作。
Read()方法是從FileStream對象所指向的文件訪問數據的主要手段:
Public int Read(byte[] array,int offset, int count)//第一個參數是被傳輸進來的字節數組,用以接受FileStream對象中的數據。第二個參數是字節數組中開始寫入數據的位置,它通常是0,表示從數組的開端的文件中向數組寫數據,最后一個參數是規定從文件中讀出多少字節。
寫入數據
寫入數據的流程是先獲取字節數組,再把字節數據轉換為字符數組,然后把這個字符數組用Write()方法寫入到文件中,當然在寫入的過程中,可以確定在文件的什么位置寫入,寫多少字符等等。
文件讀寫的范例:
讀取文件
using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
namespace myFile
{
class PRogram
{
static void Main(string[] args)
{
byte[] byData = new byte[100];//建立一個FileStream要用的字節組
char[] charData = new char[100];//建立一個字符組
try
{
FileStream aFile = new FileStream("../../../../Data.txt", FileMode.Open);//實例化一個FileStream對象,用來操作data.txt文件,操作類型是
aFile.Seek(55, SeekOrigin.Begin);//把文件指針指向,從文件開始位置向前55位字節所指的字節
aFile.Read(byData, 0, 100);//讀取FileStream對象所指的文件到字節數組里
}
catch (IOException e)
{
Console.WriteLine("close");
return;
}
Decoder d = Encoding.UTF8.GetDecoder();//
d.GetChars(byData, 0, byData.Length, charData, 0);//將編碼字節數組轉換為字符數組
Console.WriteLine(charData);
Console.ReadLine();
return;
}
}
}
寫入文件:
using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
namespace myFile
{
class Program
{
static void Main(string[] args)
{
byte[] byData = new byte[100];//建立一個FileStream要用的字節組
char[] charData = new char[100];//建立一個字符組
try
{
FileStream aFile = new FileStream("../../../../Data.txt", FileMode.Open);//實例化一個FileStream對象,用來操作data.txt文件,操作類型是
charData = "我是誰?111?".ToCharArray();//將字符串內的字符復制到字符組里
aFile.Seek(0, SeekOrigin.End);
Encoder el = Encoding.UTF8.GetEncoder();//編碼器
el.GetBytes(charData, 0, charData.Length, byData, 0, true);
aFile.Write(byData, 0, byData.Length);
}
catch (IOException e)
{
Console.WriteLine("close");
return;
}
}
}
}