C# FileStream 對象 —— 寫入數(shù)據(jù)
向隨機訪問文件中寫入數(shù)據(jù)的過程與從中讀取數(shù)據(jù)非常類似。首先需要創(chuàng)建一個字節(jié)數(shù)組;最簡單的辦法是首先構(gòu)建要寫入文件的字符數(shù)組。然后使用Encoder對象將其轉(zhuǎn)換為字節(jié)數(shù)組,其用法非常類似于Decoder對象。最后調(diào)用Write()方法,將字節(jié)數(shù)組傳送到文件中。
下面構(gòu)建一個簡單的示例演示其過程。
試一試將數(shù)據(jù)寫入隨機訪問文件:WriteRle\Program.cs
(1)在C:\BeginningCSharp7\Chapter20目錄中創(chuàng)建一個新的控制臺應(yīng)用程序WriteFile。
(2)在Program.cs文件頂部添加下面的using指令:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
(3)在Main()方法中添加下面的代碼:
static void Main(string[] args)
{
byte[] byteData;
char[] charData;
try
{
FileStream aFile = new FileStrearn fTemp.txt", FileMode.Create);
charData = "My pink half of the drainpipe.u.ToCharArray();
byteData = new byte[charData,Length];
Encoder e = Encoding.UTF8.GetEncoder();
e.GetBytes(charData, 0, charData.Length, byteData, 0, true};
// Move file pointer to beginning of file.
aFile.Seek(0, SeekOrigin.Begin);
aFile.Write(byteData, 0, byteData.Length};
}
catch (IOException ex)
{
WriteLine ("An 10 exception has been thrown!");
WriteLine(ex.ToString());
ReadKey();
return;
}
(4)運行該應(yīng)用程序。它在短暫運行后將會關(guān)閉。
(5)導(dǎo)航到應(yīng)用程序目錄——在目錄中己經(jīng)保存了文件,因為我們使用了相對路徑。目錄位于 WriteFile\bin\Debug文件夾中。打開Temp.txt文件??稍谖募锌吹轿谋?。
示例說明
此應(yīng)用程序打開自己目錄中的文件,井在文件中寫入了一個簡單字符串。這個示例的結(jié)構(gòu)非常類似于前面的示例,只是用Write()替代了 Read(),用Encoder替代了 Decoder。
下面的代碼行使用String類的ToCharAmiyO方法,創(chuàng)建了字符數(shù)組。因為C#中的所有事物都是對象,文本“My pink half of the drainpipe.”實際上是一個String對象(盡管有點兒怪),所以甚至可在字符串上調(diào)用這些靜態(tài)方法。
CharData = r,My pink half of the drainpipe.ToCharArray ();
下面的代碼行顯示了如何將字符數(shù)組轉(zhuǎn)換為FileStream對象需要的正確字節(jié)數(shù)組。
Encoder-e = Encoding.UTF8.GetEncoder();
e.GetBytes(charData, 0, charData.Length, byteData, 0, true);
這次,要基于UTT-8編碼方法來創(chuàng)建Encoder對象。也可將Unicode用于解碼,此時在寫入流之前,需要將字符數(shù)據(jù)編碼為正確的字節(jié)格式。在GetBytes()方法中可以完成這些工作,它可將字符數(shù)組轉(zhuǎn)換為字節(jié)數(shù)組。GetBytes()方法將字符數(shù)組作為第一個參數(shù)(本例中的charData),將該數(shù)組中起始位置的下標作為第二個參數(shù)(0表示數(shù)組的開頭)。第三個參數(shù)是要轉(zhuǎn)換的字符數(shù)量(charDataLength, charData數(shù)組中元素的個數(shù))。第四個參數(shù)是在其中放入數(shù)據(jù)的字節(jié)數(shù)組(byteData),第五個參數(shù)是在字節(jié)數(shù)組中開始寫入位置的索引(0表示byteData 數(shù)組的開頭)。
最后一個參數(shù)決定在結(jié)束后Encwler對象是否應(yīng)該更新其狀態(tài),這反映了一個事實:Encoder對象在內(nèi)存中保持記錄它原來在字節(jié)數(shù)組中的位置。這有助于以后調(diào)用Encoder對象,但是當只調(diào)用一次時,這就沒什么意義。最后對Encoder的調(diào)用必須將此參數(shù)設(shè)置為true,以清空其內(nèi)存,釋放對象,用于垃圾回收。
此后使用WriteO方法向FileStream寫入字節(jié)數(shù)組就變得非常簡單:
aFile.Seek(0, SeekOrigin.Begin);
aFile.Write(byteData, 0, byteData.Length);
與ReadC)方法一樣,Write()方法也有三個參數(shù):包含要寫入文件流的數(shù)據(jù)的字節(jié)數(shù)組,開始寫入的數(shù)組索引和要寫入的字節(jié)數(shù)。
點擊加載更多評論>>