C# FileStream 對(duì)象 —— 寫入數(shù)據(jù)
向隨機(jī)訪問(wèn)文件中寫入數(shù)據(jù)的過(guò)程與從中讀取數(shù)據(jù)非常類似。首先需要?jiǎng)?chuàng)建一個(gè)字節(jié)數(shù)組;最簡(jiǎn)單的辦法是首先構(gòu)建要寫入文件的字符數(shù)組。然后使用Encoder對(duì)象將其轉(zhuǎn)換為字節(jié)數(shù)組,其用法非常類似于Decoder對(duì)象。最后調(diào)用Write()方法,將字節(jié)數(shù)組傳送到文件中。
下面構(gòu)建一個(gè)簡(jiǎn)單的示例演示其過(guò)程。
試一試將數(shù)據(jù)寫入隨機(jī)訪問(wèn)文件:WriteRle\Program.cs
(1)在C:\BeginningCSharp7\Chapter20目錄中創(chuàng)建一個(gè)新的控制臺(tái)應(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ùn)行該應(yīng)用程序。它在短暫運(yùn)行后將會(huì)關(guān)閉。
(5)導(dǎo)航到應(yīng)用程序目錄——在目錄中己經(jīng)保存了文件,因?yàn)槲覀兪褂昧讼鄬?duì)路徑。目錄位于 WriteFile\bin\Debug文件夾中。打開(kāi)Temp.txt文件??稍谖募锌吹轿谋?。
示例說(shuō)明
此應(yīng)用程序打開(kāi)自己目錄中的文件,井在文件中寫入了一個(gè)簡(jiǎn)單字符串。這個(gè)示例的結(jié)構(gòu)非常類似于前面的示例,只是用Write()替代了 Read(),用Encoder替代了 Decoder。
下面的代碼行使用String類的ToCharAmiyO方法,創(chuàng)建了字符數(shù)組。因?yàn)镃#中的所有事物都是對(duì)象,文本“My pink half of the drainpipe.”實(shí)際上是一個(gè)String對(duì)象(盡管有點(diǎn)兒怪),所以甚至可在字符串上調(diào)用這些靜態(tài)方法。
CharData = r,My pink half of the drainpipe.ToCharArray ();
下面的代碼行顯示了如何將字符數(shù)組轉(zhuǎn)換為FileStream對(duì)象需要的正確字節(jié)數(shù)組。
Encoder-e = Encoding.UTF8.GetEncoder();
e.GetBytes(charData, 0, charData.Length, byteData, 0, true);
這次,要基于UTT-8編碼方法來(lái)創(chuàng)建Encoder對(duì)象。也可將Unicode用于解碼,此時(shí)在寫入流之前,需要將字符數(shù)據(jù)編碼為正確的字節(jié)格式。在GetBytes()方法中可以完成這些工作,它可將字符數(shù)組轉(zhuǎn)換為字節(jié)數(shù)組。GetBytes()方法將字符數(shù)組作為第一個(gè)參數(shù)(本例中的charData),將該數(shù)組中起始位置的下標(biāo)作為第二個(gè)參數(shù)(0表示數(shù)組的開(kāi)頭)。第三個(gè)參數(shù)是要轉(zhuǎn)換的字符數(shù)量(charDataLength, charData數(shù)組中元素的個(gè)數(shù))。第四個(gè)參數(shù)是在其中放入數(shù)據(jù)的字節(jié)數(shù)組(byteData),第五個(gè)參數(shù)是在字節(jié)數(shù)組中開(kāi)始寫入位置的索引(0表示byteData 數(shù)組的開(kāi)頭)。
最后一個(gè)參數(shù)決定在結(jié)束后Encwler對(duì)象是否應(yīng)該更新其狀態(tài),這反映了一個(gè)事實(shí):Encoder對(duì)象在內(nèi)存中保持記錄它原來(lái)在字節(jié)數(shù)組中的位置。這有助于以后調(diào)用Encoder對(duì)象,但是當(dāng)只調(diào)用一次時(shí),這就沒(méi)什么意義。最后對(duì)Encoder的調(diào)用必須將此參數(shù)設(shè)置為true,以清空其內(nèi)存,釋放對(duì)象,用于垃圾回收。
此后使用WriteO方法向FileStream寫入字節(jié)數(shù)組就變得非常簡(jiǎn)單:
aFile.Seek(0, SeekOrigin.Begin);
aFile.Write(byteData, 0, byteData.Length);
與ReadC)方法一樣,Write()方法也有三個(gè)參數(shù):包含要寫入文件流的數(shù)據(jù)的字節(jié)數(shù)組,開(kāi)始寫入的數(shù)組索引和要寫入的字節(jié)數(shù)。
點(diǎn)擊加載更多評(píng)論>>