位置:首頁(yè) > 軟件操作教程 > 編程開(kāi)發(fā) > C# > 問(wèn)題詳情

C# FileStream 對(duì)象 —— 寫入數(shù)據(jù)

提問(wèn)人:劉團(tuán)圓發(fā)布時(shí)間:2020-12-10

    向隨機(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ù)。

繼續(xù)查找其他問(wèn)題的答案?

相關(guān)視頻回答
回復(fù)(0)
返回頂部