C# Binary读写流 / BufferedStream缓存流 全套笔记
前置说明
所有高级文件流都必须依赖 FileStream 基础文件流,相当于:FileStream 是通道,BinaryWriter/BinaryReader/BufferedStream 是工具。
必备命名空间:using System.IO;、using System.Text;
一、BinaryWriter / BinaryReader 二进制读写流(重点)
1. 核心作用
专门用于二进制格式读写文件,支持直接读写string、int、double、bool等任意数据类型,无需手动字节转换,比原生 FileStream 更简洁。
2. 核心特点
读写一一对应:怎么写、怎么读(写字符串就读字符串)
封装度极高,不用手动
Encoding转换字节数组底层依然依赖 FileStream 通道
3. BinaryWriter 二进制写入(完整代码)
// 二进制写入流程:文件流 → 写入器 → Write写入 → 关闭释放 private void button1_Click(object sender, EventArgs e) { // 1. 创建基础文件流:无则新建、有则覆盖、只写权限 FileStream file = new FileStream(@"1.txt", FileMode.Create, FileAccess.Write); // 2. 绑定文件流,创建二进制写入工具 BinaryWriter bw = new BinaryWriter(file); // 3. 直接写入任意数据类型(无需转字节) bw.Write("世界杯中国什么时候进"); // 4. 关闭工具和文件流 bw.Close(); file.Close(); // 5. 释放资源 bw.Dispose(); file.Dispose(); }4. BinaryReader 二进制读取(完整代码)
// 二进制读取流程:文件流 → 读取器 → 对应类型读取 → 关闭释放 private void button2_Click(object sender, EventArgs e) { // 1. 只读方式打开文件 FileStream file = new FileStream(@"1.txt", FileMode.Open, FileAccess.Read); // 2. 创建二进制读取工具 BinaryReader br = new BinaryReader(file); // 3. 对应写入类型读取(写入string就必须ReadString) string ss = br.ReadString(); this.Text = ss; // 4. 关闭释放 br.Close(); file.Close(); br.Dispose(); file.Dispose(); }5. 必考核心规则
读写类型必须严格匹配:Write(string) → ReadString(),否则报错或乱码
BinaryWriter 写入的文件自带二进制格式头,记事本打开是乱码,只能用 BinaryReader 正常读取
必须先关外层工具(Binary),再关底层文件流(FileStream)
二、BufferedStream 缓存文件流
1. 核心原理
BufferedStream缓存缓冲流:不直接频繁读写硬盘,先把数据读写到内存缓存区,减少磁盘IO次数,大幅提升大文件读写速度。
核心优势:硬盘读写慢、内存读写快,用缓存中转,优化性能。
2. 核心方法
Flush():强制清空缓存区,将缓存数据写入磁盘(防止数据滞留内存丢失)
Read():从缓存区读取数据
Write():写入数据到缓存区
3. BufferedStream 写入代码(注释版)
// 创建缓存流绑定文件创建通道 BufferedStream buffer = new BufferedStream(File.Create(@"1.txt")); // 字符串转字节数组 byte[] bs = Encoding.Default.GetBytes("主要把本地数据读取到缓存区里面,"); // 写入缓存区(不是直接写硬盘) buffer.Write(bs, 0, bs.Length); // 强制刷新:缓存数据落地写入硬盘 buffer.Flush(); // 关闭释放 buffer.Close();4. BufferedStream 读取代码(循环读取完整版)
// 打开文件并绑定缓存流 BufferedStream b1 = new BufferedStream(File.OpenRead(@"1.txt")); // 根据缓存流长度创建字节数组 byte[] bs = new byte[b1.Length]; string ss = ""; // 循环读取:返回值>0 代表还有数据可读 while (b1.Read(bs, 0, bs.Length) > 0) { ss += Encoding.Default.GetString(bs); Console.WriteLine(Encoding.Default.GetString(bs)); } this.Text = ss; b1.Close();5. 读取核心考点
Read()返回值 > 0:存在未读完数据,继续循环Read()返回值 = 0:数据读取完毕,结束读取大文件必须循环读取,不能一次性读完
三、三种文件流核心区别(考试必考对比)
流类型 | 特点 | 适用场景 |
|---|---|---|
FileStream | 基础字节流,手动转编码,无缓存 | 所有文件底层读写、小文件通用 |
Binary读写 | 支持直接读写任意数据类型,无需转字节,二进制加密存储 | 保存对象、数字、混合类型数据 |
BufferedStream | 内存缓存中转,减少磁盘IO,速度快 | 大文件高速读写 |
四、全套易错点汇总
Binary 读写类型必须一一对应,写错读取直接报错
BufferedStream 写入必须调用Flush(),否则数据滞留内存、写入失败
所有流必须 Close + Dispose,否则文件占用
Binary 保存的文件乱码是正常二进制格式,无需解码
缓存流读取必须 while 循环判断返回值,防止漏读数据
五、IO流专属背诵口诀
基础File通通道,Binary读写类型套;
二进制存乱码常,对应读取才正常;
缓存Buff提速快,Flush刷新落硬盘;
所有流类必释放,读写匹配不报错。
