在C#开发中,处理二进制文件是很多场景下的必备技能,比如读取自定义格式的数据文件、保存序列化对象、处理音视频原始数据等,BinaryReader和BinaryWriter是.NET框架提供的专门用于二进制数据读写的类,能够高效处理各类基础数据类型的二进制转换。

二进制文件读写基础概念
二进制文件和文本文件的区别在于,二进制文件不会按照字符编码解析内容,而是直接以字节形式存储数据,因此读写时需要严格按照写入时的数据类型和顺序来操作,否则会出现数据解析错误。BinaryWriter负责将基础数据类型转换为二进制格式写入流,BinaryReader则负责从流中按照对应类型读取二进制数据。
使用BinaryWriter写入二进制文件
写入二进制文件的核心步骤是创建文件流,然后实例化BinaryWriter对象,调用对应的写入方法写入数据,最后释放资源。下面是一个完整的写入示例:
using System;
using System.IO;
namespace BinaryFileDemo
{
class Program
{
static void Main(string[] args)
{
string filePath = "test.dat";
// 创建文件流,使用FileMode.Create覆盖或创建新文件
using (FileStream fs = new FileStream(filePath, FileMode.Create))
{
// 实例化BinaryWriter,指定编码为UTF8,避免中文乱码
using (BinaryWriter bw = new BinaryWriter(fs, System.Text.Encoding.UTF8))
{
// 写入不同类型的数据
bw.Write(100); // 写入int类型
bw.Write(3.14f); // 写入float类型
bw.Write("测试数据"); // 写入字符串
bw.Write(true); // 写入bool类型
Console.WriteLine("二进制文件写入完成");
}
}
}
}
}
上面的代码中使用了using语句,能够自动释放FileStream和BinaryWriter的资源,避免内存泄漏。写入字符串时BinaryWriter会自动在字符串前添加长度前缀,读取时BinaryReader会根据这个前缀正确读取字符串内容。
使用BinaryReader读取二进制文件
读取二进制文件需要和写入时的数据类型、顺序完全一致,否则会读取到错误的数据甚至抛出异常。下面是对应上面写入操作的读取示例:
using System;
using System.IO;
namespace BinaryFileDemo
{
class Program
{
static void Main(string[] args)
{
string filePath = "test.dat";
// 判断文件是否存在
if (!File.Exists(filePath))
{
Console.WriteLine("文件不存在");
return;
}
// 打开文件流,使用FileMode.Open打开已有文件
using (FileStream fs = new FileStream(filePath, FileMode.Open))
{
// 实例化BinaryReader,编码需要和写入时一致
using (BinaryReader br = new BinaryReader(fs, System.Text.Encoding.UTF8))
{
// 按照写入顺序读取数据
int intValue = br.ReadInt32();
float floatValue = br.ReadSingle();
string strValue = br.ReadString();
bool boolValue = br.ReadBoolean();
// 输出读取到的数据
Console.WriteLine($"读取到的int值:{intValue}");
Console.WriteLine($"读取到的float值:{floatValue}");
Console.WriteLine($"读取到的字符串:{strValue}");
Console.WriteLine($"读取到的bool值:{boolValue}");
}
}
}
}
}
读写二进制文件的注意事项
- 编码一致性:如果写入时指定了编码,读取时必须使用相同的编码,否则字符串会出现乱码。
- 读写顺序一致:写入数据的类型和顺序必须和读取时完全对应,比如先写int再写string,读取时也要先读int再读string,顺序错乱会导致数据解析错误。
- 资源释放:一定要使用
using语句或者手动调用Dispose方法释放流和读写器资源,避免文件被占用。 - 异常处理:读写文件时可能会出现文件不存在、权限不足、数据格式错误等异常,建议使用
try-catch块捕获异常,提升程序健壮性。
自定义数据结构的二进制读写
如果需要读写自定义的类或者结构体,需要手动处理每个字段的读写,下面是一个自定义结构体的读写示例:
using System;
using System.IO;
namespace BinaryFileDemo
{
// 自定义结构体
public struct UserData
{
public int Id;
public string Name;
public int Age;
}
class Program
{
static void Main(string[] args)
{
string filePath = "user.dat";
UserData writeUser = new UserData
{
Id = 1,
Name = "张三",
Age = 25
};
// 写入自定义结构体
using (FileStream fs = new FileStream(filePath, FileMode.Create))
using (BinaryWriter bw = new BinaryWriter(fs, System.Text.Encoding.UTF8))
{
bw.Write(writeUser.Id);
bw.Write(writeUser.Name);
bw.Write(writeUser.Age);
}
// 读取自定义结构体
UserData readUser = new UserData();
using (FileStream fs = new FileStream(filePath, FileMode.Open))
using (BinaryReader br = new BinaryReader(fs, System.Text.Encoding.UTF8))
{
readUser.Id = br.ReadInt32();
readUser.Name = br.ReadString();
readUser.Age = br.ReadInt32();
}
Console.WriteLine($"用户ID:{readUser.Id},姓名:{readUser.Name},年龄:{readUser.Age}");
}
}
}
对于复杂的自定义类型,也可以结合序列化功能实现更便捷的二进制读写,但需要注意序列化的兼容性和性能问题,根据实际场景选择合适的方式。
C#BinaryReaderBinaryWriter二进制文件读写修改时间:2026-07-11 00:15:27