C# BinaryWriter和BinaryReader

介绍

BinaryWriter 类用于向文件写入 BinaryWriter,底层依赖 FileStream 文件流

通过 BinaryWriter 写二进制数据,比 FileStream 文件流更加方便,功能更多

BinaryReader 类用于向文件写入 BinaryReader,底层依赖 FileStream 文件流

通过 BinaryReader 写二进制数据,比 FileStream 文件流更加方便,功能更多

BinaryWriter

构造函数

BinaryWriter() 初始化写入流 BinaryWriter 类的新实例。

BinaryWriter(Stream) 根据指定的流并使用 UTF-8 编码初始化 BinaryWriter 类的新实例。

BinaryWriter(Stream, Encoding) 根据指定的流和字符编码初始化 BinaryWriter 类的新实例。

BinaryWriter(Stream, Encoding, Boolean):根据指定的流和字符编码初始化 BinaryWriter 类的新实例,并选择性地将流保持打开状态。

方法

Close() 关闭当前 BinaryWriter 和基础流。

Dispose() 释放 BinaryWriter 类的当前实例使用的所有资源。

Dispose(Boolean) 释放 BinaryWriter 使用的非托管资源,并选择性地释放托管资源。

Flush() 清除当前编写器的所有缓冲区,并导致任何缓冲数据写入基础设备。

Seek(Int32, SeekOrigin) 设置当前流中的位置。

Write(Boolean) 将一字节 Boolean 值写入当前流,0 表示 false,1 表示 true。

Write(Byte) 将无符号字节写入当前流,并将流位置提升一个字节。

Write(Byte[]) 将字节数组写入基础流。

Write(Byte[], Int32, Int32) 将字节数组的区域写入当前流。

Write(Char) 将 Unicode 字符写入当前流,并根据所使用的 Encoding 和写入流的特定字符推进流的当前位置。

Write(Char[]) 将字符数组写入当前流,并根据所使用的 Encoding 和写入流的特定字符推进流的当前位置。

Write(Char[], Int32, Int32) 将字符数组的一部分写入当前流,并根据所使用的 Encoding 以及写入流的特定字符推进流的当前位置。

Write(Decimal) 将十进制值写入当前流,并将流位置提升 16 个字节。

Write(Double) 将八字节浮点值写入当前流,并将流位置提升 8 个字节。

Write(Int16) 将双字节有符号整数写入当前流,并将流位置提升两个字节。

Write(Int32) 将四字节有符号整数写入当前流,并将流位置提升 4 个字节。

Write(Int64) 将八字节有符号整数写入当前流,并将流位置提升 8 个字节。

Write(String) 在 BinaryWriter的当前编码中向此流写入长度前缀字符串,并根据使用的编码和写入流的特定字符推进流的当前位置。

Write(UInt16) 将双字节无符号整数写入当前流,并将流位置提升两个字节。

Write(UInt32) 将四字节无符号整数写入当前流,并将流位置提升 4 个字节。

Write(UInt64) 将八字节无符号整数写入当前流,并将流位置提升 8 个字节。

例子

using (FileStream fs = new FileStream(imagePath, FileMode.Create))
{
    using (var writer = new BinaryWriter(fs))
    {

        writer.Write(image.RawBytes.ToArray());
    }
}

BinaryReader

构造函数

BinaryReader(Stream) 基于所指定的流和特定的 UTF-8 编码,初始化 BinaryReader 类的新实例。

BinaryReader(Stream, Encoding) 基于所指定的流和特定的字符编码,初始化 BinaryReader 类的新实例。

BinaryReader(Stream, Encoding, Boolean):基于所提供的流和特定的字符编码,初始化 BinaryReader 类的新实例,有选择性的打开流。

方法

Close() 关闭当前阅读器及基础流。

Dispose() 释放 BinaryReader 类的当前实例所使用的所有资源。

Dispose(Boolean) 释放 BinaryReader 类使用的非托管资源,并可以选择释放托管资源。

Read() 从基础流中读取字符,并根据所使用的 Encoding 和从流中读取的特定字符,提升流的当前位置。

Read(Byte[], Int32, Int32) 从字节数组中的指定点开始,从流中读取指定的字节数。

Read(Char[], Int32, Int32) 从字符数组中的指定点开始,从流中读取指定的字符数。

ReadByte() 从当前流中读取下一个字节,并使流的当前位置提升 1 个字节。

ReadBytes(Int32) 从当前流中读取指定的字节数以写入字节数组中,并将当前位置前移相应的字节数。

ReadChar() 从当前流中读取下一个字符,并根据所使用的 Encoding 和从流中读取的特定字符,提升流的当前位置。

ReadChars(Int32) 从当前流中读取指定的字符数,并以字符数组的形式返回数据,然后根据所使用的 Encoding 和从流中读取的特定字符,将当前位置前移。

ReadDecimal() 从当前流中读取十进制数值,并将该流的当前位置提升十六个字节。

ReadDouble() 从当前流中读取 8 字节浮点值,并使流的当前位置提升 8 个字节。

ReadInt16() 从当前流中读取 2 字节有符号整数,并使流的当前位置提升 2 个字节。

ReadInt32() 从当前流中读取 4 字节有符号整数,并使流的当前位置提升 4 个字节。

ReadInt64() 从当前流中读取 8 字节有符号整数,并使流的当前位置提升 8 个字节。

ReadString() 从当前流中读取一个字符串。 字符串有长度前缀,一次 7 位地被编码为整数。

ReadUInt16() 使用 Little-Endian 编码从当前流中读取 2 字节无符号整数,并将流的位置提升 2 个字节。

ReadUInt32() 从当前流中读取 4 字节无符号整数并使流的当前位置提升 4 个字节。

ReadUInt64() 从当前流中读取 8 字节无符号整数并使流的当前位置提升 8 个字节。

例子

using System;
using System.IO;
using System.Text;

class ConsoleApplication
{
    const string fileName = "AppSettings.dat";

    static void Main()
    {
        WriteDefaultValues();
        DisplayValues();
    }

    public static void WriteDefaultValues()
    {
        using (var stream = File.Open(fileName, FileMode.Create))
        {
            using (var writer = new BinaryWriter(stream, Encoding.UTF8, false))
            {
                writer.Write(1.250F);
                writer.Write(@"c:\Temp");
                writer.Write(10);
                writer.Write(true);
            }
        }
    }

    public static void DisplayValues()
    {
        float aspectRatio;
        string tempDirectory;
        int autoSaveTime;
        bool showStatusBar;

        if (File.Exists(fileName))
        {
            using (var stream = File.Open(fileName, FileMode.Open))
            {
                using (var reader = new BinaryReader(stream, Encoding.UTF8, false))
                {
                    aspectRatio = reader.ReadSingle();
                    tempDirectory = reader.ReadString();
                    autoSaveTime = reader.ReadInt32();
                    showStatusBar = reader.ReadBoolean();
                }
            }

            Console.WriteLine("Aspect ratio set to: " + aspectRatio);
            Console.WriteLine("Temp directory is: " + tempDirectory);
            Console.WriteLine("Auto save time set to: " + autoSaveTime);
            Console.WriteLine("Show status bar: " + showStatusBar);
        }
    }
}