C# BinaryWriter和BinaryReader 作者:马育民 • 2025-07-02 15:19 • 阅读:10002 # 介绍 `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); } } } ``` 原文出处:http://malaoshi.top/show_1GW1PuZJGl72.html