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

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

提問人:劉團圓發(fā)布時間:2020-12-10

    向隨機訪問文件中寫入數(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ù)。

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

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