天天看點

3-6 讀寫二進制檔案

u<b>本節學習目标:</b>

n了解二進制檔案讀取器/編寫器

n學習建立BinaryReader類的一些主要方法

n學習建立BinaryWriter類的一些主要方法

n學習通過二進制讀寫操作進行圖檔的存儲與複制

n學習通過二進制讀寫操作實作圖檔檔案與資料庫Image類型資料的存儲與讀取

在前面兩節,讀寫的檔案都是針對文本檔案。這一節,重點講述二進制檔案的讀寫。什麼是二進制檔案呢?

<b></b><b>小知識:</b>

<b>二進制檔案</b><b></b>

英文:Binary files - 包含在 ASCII 及擴充 ASCII 字元中編寫的資料或程式指令的檔案。計算機檔案基本上分為二種:二進制檔案和 ASCII(也稱純文字)檔案,圖形檔案及文字處理程式等計算機程式都屬于二進制檔案。這些檔案含有特殊的格式及計算機代碼。ASCII 則是可以用任何文字處理程式閱讀的簡單文本檔案。

從本質上來說他們之間沒有什麼差別,因為他們在硬碟上都有一種的存放方式--二進制,但是如果要對他們有些區分的話,那可以這樣了解。我們現在的每個字元由一個或多個位元組組成,每個位元組都是用的-128—127之間的部分數值來表示的,也就是說,-128——127之間還有一些資料沒有對應任何字元的任何位元組。如果一個檔案中的每個位元組的内容都是可以表示成字元的資料,我們就可以稱這個檔案為文本檔案,可見,文本檔案隻是二進制檔案中的一種特例,為了與文本檔案相差別,人們又把除了文本檔案以外的檔案稱為二進制檔案,由于很難嚴格區分文本檔案和二進制檔案的概念,是以我們可以簡單地認為,如果一個檔案專門用于存儲文本字元的資料,沒有包含字元以外的其他資料,我們就稱之為文本檔案,除此之外的檔案就是二進制檔案。

    在讀寫二進制檔案時,需要研究的讀取器/編寫器組是BinaryReader和BinaryWriter,它們都從System.Object直接派生。這些類型可以讓我們從基層流中以簡潔的二進制格式讀取或寫入離散資料類型。BinaryWriter類型定義了一個多次重載的Write()方法,用于把資料類型寫入基層的流。除了Write()方法,BinaryWriter還提供了另外一些成員讓我們能擷取或設定從Stream派生的類型,并且提供了随機資料通路的支援。建立讀取器/編寫器(BinaryReader和BinaryWriter)需要注意的事項有兩點:

n要使用 BinaryReader 和 BinaryWriter 類

n這兩個對象都需要在FileStream上建立

<b></b><b></b> 

<b>小實驗:建立一個BinaryWriter對象</b>

FileStream filestream = new FileStream(Filename, FileMode.Create);

BinaryWriter objBinaryWriter = new BinaryWriter(filestream);

類BinaryReader用特定的編碼将基中繼資料類型讀作二進制值。類BinaryReader有幾個常用的方法,如表3-13所示:

表3-13 類BinaryReader的常用方法

<b>方法</b>

<b>說明</b>

Close()

關閉目前閱讀器及基礎流。

Read()

已重載。 從基礎流中讀取字元,并提升流的目前位置。

ReadDecimal()

從目前流中讀取十進制數值,并将該流的目前位置提升十六個位元組。

ReadByte()

從目前流中讀取下一個位元組,并使流的目前位置提升1個位元組。

ReadInt16()

從目前流中讀取2位元組有符号整數,并使流的目前位置提升2個位元組。

ReadInt32()

從目前流中讀取4位元組有符号整數,并使流的目前位置提升4個位元組。

ReadString()

從目前流中讀取一個字元串。字元串有長度字首,一次7位地被編碼為整數。

<b>小實驗:建立一個BinaryReader類的一些主要方法</b>

using System;

using System.IO;

class BinaryRW

{

    static void Main()

    {

        int i = 0;

        char[] invalidPathChars = Path.InvalidPathChars;

        MemoryStream memStream = new MemoryStream();

        BinaryWriter binWriter = new BinaryWriter(memStream);

        // 寫入記憶體

        binWriter.Write("Invalid file path characters are: ");

        for (i = 0; i &lt; invalidPathChars.Length; i++)

        {

            binWriter.Write(invalidPathChars[i]);

        }

        // 用作生成編寫器的記憶體流同樣作為生成讀取器的記憶體流

        BinaryReader binReader = new BinaryReader(memStream);

        // 設定流的起點

        memStream.Position = 0;

        // 從記憶體中讀取資料,并把資料寫入控制台

        Console.Write(binReader.ReadString());

        char[] memoryData = new char[memStream.Length - memStream.Position];

        for (i = 0; i &lt; memoryData.Length; i++)

            memoryData[i] = Convert.ToChar(binReader.Read());

        Console.WriteLine(memoryData);

    }

}

類BinaryWriter以二進制形式将基元類型寫入流,并支援用特定的編碼寫入字元串。類BinaryWriter有幾個常用的方法,如表3-14所示:

表3-14 類BinaryWriter的常用方法

關閉目前的 BinaryWriter 和基礎流。

Flush()

清理目前編寫器的所有緩沖區,使所有緩沖資料寫入基礎裝置。

Write()

已重載。 将值寫入目前流。

<b>小實驗:建立一個BinaryWriter類的一些主要方法</b>

<b></b> 

        using (BinaryWriter binWriter = new BinaryWriter(File.Open(fileName, FileMode.Create)))

            binWriter.Write(aspectRatio);

            binWriter.Write(lookupDir);

            binWriter.Write(autoSaveTime);

            binWriter.Write(showStatusBar);

本文轉自 qianshao 51CTO部落格,原文連結:http://blog.51cto.com/qianshao/210969,如需轉載請自行聯系原作者