[转]C# FileStream和StreamWriter用法

FielStream類操作的是字節和節節數組,而stream類操作的是字符數據。字符數據易於使用,但是有些操作,比如隨機文件訪問(訪問文件中間某點的數據),就必須由FileStream對象執行。

FielStream類維護內部文件指針,該指針指向文件中進行下一次讀寫操作的位置。

FileStream只能處理原始字節(raw byte),處理原去吧字節的功能使用FileStream類可以用於處理任何數據文件。

通過讀取字節數據,FileStream對像可以用於讀取圖像和聲音。代價是FileStream類不能將數據直接讀入字符串

此指針可以修改用Seek方法,它有兩個參數:

第一個參數:規定文件指針以字節為參數的移動距離

第二個參數:規定開始計算的起始位置

byte[] byDataValue = new byte[200];

char[] charDataValue = new char[200];

/// <summary>

/// FilesStream讀取用法

/// </summary>

private void FilesStreamReadFile()

{

try

{

FileStream fsFile = new FileStream(@"d:\log.cs", FileMode.Open);

//文件指針移到文件的135個字節

fsFile.Seek(135, SeekOrigin.Begin);

//將接下來的字節讀到Array中

fsFile.Read(byDataValue, 0, 200);

}

catch (Exception e)

{

throw e;

}

//將字節轉換成字符

Decoder dc = Encoding.UTF8.GetDecoder();

//字節數組轉換成字符數組,便於顯示

dc.GetChars(byDataValue, 0, byDataValue.Length, charDataValue, 0);

}

/// <summary>

/// FilesStream寫入用法

/// </summary>

private void FileStreamWriteFile()

{

FileStream fsFile = new FileStream(@"D:\log.txt", FileMode.Create);

charDataValue="This is test string".ToCharArray();

byDataValue=new byte[charDataValue.Length];

//將字符數組轉換成字節數組

Encoder ec=Encoding.UTF8.GetEncoder();

ec.GetBytes(charDataValue,0,charDataValue.Length,byDataValue,0,true);

//將指針設定起始位置

fsFile.Seek(0,SeekOrigin.Begin);

//寫入文件

fsFile.Write(byDataValue,0,byDataValue.Length);

}

FileStream對象通常會在StreamWriter或StreamReader內使用,並使用它們的方法處理文件。

/// <summary>

/// StreamWriter寫入方法

/// </summary>

private void StreamWriterMetod()

{

try

{

FileStream fsFile = new FileStream(@"d:\log.txt",FileMode.OpenOrCreate);

StreamWriter swWriter = new StreamWriter(fsFile);

//寫入數據

swWriter.WriteLine("Hello Wrold.");

swWriter.WriteLine("It is now {0}", DateTime.Now.ToLongDateString());

swWriter.Close();

}

catch (Exception e)

{

throw e;

}

}

/// <summary>

/// StreamWriter讀取方法

/// </summary>

private void StreamReaderMetod()

{

string sLine = "";

try

{

FileStream fsFile = new FileStream(@"d:\log.txt", FileMode.Open);

StreamReader srReader = new StreamReader(fsFile);

//讀取文件(讀取大文件時,最好不要用此方法)

sLine = srReader.ReadToEnd();

txbValue.Text = sLine;

srReader.Close();

}

catch (Exception e)

{

throw e;

}

}

/// <summary>

/// StreamWriter讀取方法2

/// </summary>

private void StreamReaderMetodTwo()

{

try

{

FileStream fsFile = new FileStream(@"d:\log.txt", FileMode.Open);

/*

* 讀取數據最簡單的方法是Read()。此方法將流的下一個字符作為正整數值返回,

* 如果達到了流的結尾處,則返回-1。

*/

StreamReader srReader = new StreamReader(fsFile);

int iChar;

iChar = srReader.Read();

while (iChar != -1)

{

txbValue.Text += (Convert.ToChar(iChar));

iChar = srReader.Read();

}

srReader.Close();

}

catch (Exception e)

{

throw e;

}

}

注:FileMode枚舉成員值在文件存在與不存在時的情況

成員

文件存在時

文件不存在時

Append

打開文件,流指向文件的末尾,只能與枚舉FileAcess.Write聯合使用

創建一個新文件。只能與枚舉FileAcess.Write聯合使用

Create

刪除該文件,然後創建新文件

創建新文件

CreateNew

拋出異常

創建新文件

Open

打開現有文件,流指向文件開頭

拋出異常

OpenOrCreate

打開文件,流指向文件開頭

創建新文件

Truhncate

打開現有文件,清除其內容。流指向文件開頭,保留文件的初始創建日期。

拋出異常