3-4  读写二进制文件

u 本节学习目标:
n 了解二进制文件读取器 / 编写器
n 学习建立 BinaryReader 类的一些主要方法
n 学习建立 BinaryWriter 类的一些主要方法
n 学习通过二进制读写操作进行图片的存储与复制
n 学习通过二进制读写操作实现图片文件与数据库 Image 类型数据的存储与读取
在前面两节,读写的文件都是针对文本文件。这一节,重点讲述二进制文件的读写。什么是二进制文件呢?
 
小知识:
二进制文件
英文:Binary files - 包含在 ASCII 及扩展 ASCII 字符中编写的数据或程序指令的文件。计算机文件基本上分为二种:二进制文件和 ASCII(也称纯文本)文件,图形文件及文字处理程序等计算机程序都属于二进制文件。这些文件含有特殊的格式及计算机代码。ASCII 则是可以用任何文字处理程序阅读的简单文本文件。
从本质上来说他们之间没有什么区别,因为他们在硬盘上都有一种的存放方式--二进制,但是如果要对他们有些区分的话,那可以这样理解。我们现在的每个字符由一个或多个字节组成,每个字节都是用的-128 127之间的部分数值来表示的,也就是说,-128 —— 127之间还有一些数据没有对应任何字符的任何字节。如果一个文件中的每个字节的内容都是可以表示成字符的数据,我们就可以称这个文件为文本文件,可见,文本文件只是二进制文件中的一种特例,为了与文本文件相区别,人们又把除了文本文件以外的文件称为二进制文件,由于很难严格区分文本文件和二进制文件的概念,所以我们可以简单地认为,如果一个文件专门用于存储文本字符的数据,没有包含字符以外的其他数据,我们就称之为文本文件,除此之外的文件就是二进制文件。

 

 

 

 

 

 

 

3-4-1 二进制文件读取器/编写器介绍

    在读写二进制文件时,需要研究的读取器/编写器组是BinaryReaderBinaryWriter,它们都从System.Object直接派生。这些类型可以让我们从基层流中以简洁的二进制格式读取或写入离散数据类型。BinaryWriter类型定义了一个多次重载的Write()方法,用于把数据类型写入基层的流。除了Write()方法,BinaryWriter还提供了另外一些成员让我们能获取或设置从Stream派生的类型,并且提供了随机数据访问的支持。建立读取器/编写器(BinaryReaderBinaryWriter)需要注意的事项有两点:
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);
        }
    }
}