3-6 讀寫二進位文件
- 2020 年 1 月 8 日
- 筆記
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); } } } |
---|