3-6 讀寫二進制文件

3-4 讀寫二進制文件

u本節學習目標:

n了解二進制文件讀取器/編寫器

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

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

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

n學習通過二進制讀寫操作實現圖片文件與數據庫Image類型數據的存儲與讀取

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

小知識:

二進制文件 英文:Binary files – 包含在 ASCII 及擴展 ASCII 字符中編寫的數據或程序指令的文件。計算機文件基本上分為二種:二進制文件和 ASCII(也稱純文本)文件,圖形文件及文字處理程序等計算機程序都屬於二進制文件。這些文件含有特殊的格式及計算機代碼。ASCII 則是可以用任何文字處理程序閱讀的簡單文本文件。 從本質上來說他們之間沒有什麼區別,因為他們在硬盤上都有一種的存放方式–二進制,但是如果要對他們有些區分的話,那可以這樣理解。我們現在的每個字符由一個或多個位元組組成,每個位元組都是用的-128—127之間的部分數值來表示的,也就是說,-128——127之間還有一些數據沒有對應任何字符的任何位元組。如果一個文件中的每個位元組的內容都是可以表示成字符的數據,我們就可以稱這個文件為文本文件,可見,文本文件只是二進制文件中的一種特例,為了與文本文件相區別,人們又把除了文本文件以外的文件稱為二進制文件,由於很難嚴格區分文本文件和二進制文件的概念,所以我們可以簡單地認為,如果一個文件專門用於存儲文本字符的數據,沒有包含字符以外的其他數據,我們就稱之為文本文件,除此之外的文件就是二進制文件。

3-4-1 二進制文件讀取器/編寫器介紹

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

n要使用 BinaryReader 和 BinaryWriter 類

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

小實驗:建立一個BinaryWriter對象

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

類BinaryReader用特定的編碼將基元數據類型讀作二進制值。類BinaryReader有幾個常用的方法,如表3-13所示:

表3-13 類BinaryReader的常用方法

方法

說明

Close()

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

Read()

已重載。 從基礎流中讀取字符,並提升流的當前位置。

ReadDecimal()

從當前流中讀取十進制數值,並將該流的當前位置提升十六個位元組。

ReadByte()

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

ReadInt16()

從當前流中讀取2位元組有符號整數,並使流的當前位置提升2個位元組。

ReadInt32()

從當前流中讀取4位元組有符號整數,並使流的當前位置提升4個位元組。

ReadString()

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

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

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 < 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 < memoryData.Length; i++)         {             memoryData[i] = Convert.ToChar(binReader.Read());         }         Console.WriteLine(memoryData);     } }

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

表3-14 類BinaryWriter的常用方法

方法

說明

Close()

關閉當前的 BinaryWriter 和基礎流。

Flush()

清理當前編寫器的所有緩衝區,使所有緩衝數據寫入基礎設備。

Write()

已重載。 將值寫入當前流。

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

using System; using System.IO;   class BinaryRW {     static void Main()     {         using (BinaryWriter binWriter = new BinaryWriter(File.Open(fileName, FileMode.Create)))         {             binWriter.Write(aspectRatio);             binWriter.Write(lookupDir);             binWriter.Write(autoSaveTime);             binWriter.Write(showStatusBar);         }     } }