C#WinForm BinaryWriter、BinaryReader 二进制读写+BufferedStream 缓存流读写+File类+StreamReader与StreamWriter 读写流

📅 2026/6/17 2:38:32
C#WinForm BinaryWriter、BinaryReader 二进制读写+BufferedStream 缓存流读写+File类+StreamReader与StreamWriter 读写流
一、知识点概述BinaryWriter二进制写入器与 BinaryReader二进制读取器是C#封装好的高级流操作类专门用于以二进制形式读写本地文件。该类不能独立工作必须依托 FileStream 文件流对象才可使用。相较于原生FileStream二进制读写工具最大优势无需手动进行字符串与字节数组的转换能够直接写入/读取字符串、整数、布尔值、小数等多种数据类型极大简化文件开发操作。二进制保存的文件用记事本打开会出现乱码属于正常现象只能通过对应读取工具解析数据。常用场景保存游戏数据、软件配置信息、账号密码、加密存储文件、存储多类型复合型数据。二、整体功能介绍1. 按钮1借助FileStreamBinaryWriter以二进制模式向1.txt文件写入指定字符串2. 按钮2借助FileStreamBinaryReader读取二进制文件中的字符串并赋值给窗体标题展示。三、完整可运行源代码using System; using System.IO; using System.Windows.Forms; namespace _3_BinaryWriter_和_BinaryReader { public partial class Form1 : Form { public Form1() { InitializeComponent(); //BinaryWriter和 BinaryReader: 二进制流读写操作需要提供文件流对象 } //二进制写入数据 private void button1_Click(object sender, EventArgs e) { //1 创建文件流 主要是给BinaryWriter提供一个参数 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(); } //二进制读取数据 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 ss br.ReadString(); //4 将读取的数据展示在窗体标题 this.Text ss; //5 关闭、释放资源 br.Close(); file.Close(); br.Dispose(); file.Dispose(); } } }四、二进制写入操作button1分步拆解步骤1创建FileStream文件流对象FileStream file new FileStream(1.txt,FileMode.Create,FileAccess.Write);参数解析第一个参数 1.txt文件相对路径文件生成在程序运行根目录第二个参数 FileMode.Create文件创建模式文件不存在则自动新建文件已存在则直接覆盖原有内容第三个参数 FileAccess.Write设置文件流权限为写入权限仅支持写入数据无法读取数据。步骤2创建二进制写入工具BinaryWriter bw new BinaryWriter(file);BinaryWriter无法单独使用构造函数需要传入FileStream对象绑定对应的文件流所有写入操作最终都会交给文件流保存到本地。步骤3写入数据bw.Write(世界杯中国什么时候进);Write()为重载方法支持string、int、double、bool等所有基础数据类型内部自动完成字符串转二进制字节操作不需要手动编码转换简化开发。步骤4关闭资源bw.Close(); file.Close();Close()作用关闭数据流解除程序对当前文件的占用规范写法先关闭读写工具再关闭底层文件流。步骤5释放内存bw.Dispose(); file.Dispose();Dispose()作用销毁对象、释放内存资源避免内存泄漏是流操作必不可少的收尾步骤。五、二进制读取操作button2分步拆解步骤1创建只读文件流FileStream file new FileStream(1.txt,FileMode.Open,FileAccess.Read);参数解析FileMode.Open打开指定文件若文件不存在直接抛出异常FileAccess.Read权限设置为只读仅能读取文件内容禁止写入、修改文件。步骤2创建二进制读取工具BinaryReader br new BinaryReader(file);依托已开启的文件流创建专属读取器用于解析文件内的二进制数据。步骤3读取数据并展示string ss br.ReadString(); this.Text ss;ReadString()专门读取二进制文件中的字符串数据核心规则写入什么类型数据读取必须对应调用相同类型的方法顺序、类型不可错乱否则程序报错。步骤4关闭并释放资源br.Close(); file.Close(); br.Dispose(); file.Dispose();读取完成后必须关闭并释放资源防止文件长期被程序占用无法删除和修改。六、读写工具配套读取方法1. 字符串Write(string) —— ReadString()2. 整型数据Write(int) —— ReadInt32()3. 布尔类型Write(bool) —— ReadBoolean()4. 小数类型Write(double) —— ReadDouble()七、执行流程1. 写入流程创建写入文件流→初始化BinaryWriter→直接写入数据→关闭工具与文件流→释放内存2. 读取流程创建只读文件流→初始化BinaryReader→匹配类型读取数据→展示数据→关闭释放所有资源。八、知识点总结1. BinaryWriter、BinaryReader 依赖 FileStream不能独立实例化使用2. 二进制读写最大优点自动完成字节转换无需手动编写编码转换代码3. 写入和读取的数据类型、存储顺序必须完全一致4. 二进制文件记事本打开乱码属于正常现象只能用BinaryReader解析5. 写入操作匹配CreateWrite权限读取操作匹配OpenRead权限6. 所有流对象使用完毕必须执行Close关闭、Dispose释放资源。九、常见易错点1. 权限错误写入使用Read权限、读取使用Write权限直接运行报错2. 模式错误读取文件使用Create覆盖原有数据造成数据丢失3. 类型不匹配写入字符串读取调用读取int的方法程序直接崩溃4. 遗漏收尾未关闭文件流文件被进程锁定无法删除与移动5. 误解乱码误以为二进制文件乱码是代码BUG二进制文件本身不支持明文查看。———————BufferedStream 缓存流读写——————一、知识点简介BufferedStream 叫做缓存流/缓冲流属于优化版文件读写类。底层自带内存缓冲区专门用来优化文件读写性能。普通FileStream每次读写都会直接操作电脑硬盘硬盘读写速度慢、损耗大BufferedStream会先将数据暂存到内存缓冲区中程序优先读写内存缓存减少直接访问硬盘的次数从而提升读写速度、降低硬盘损耗。BufferedStream不能单独使用必须包裹FileStream文件流对象本质是对FileStream的功能升级与性能优化。二、功能概述1、写入原理程序数据→内存缓冲区→统一写入硬盘2、读取原理硬盘数据一次性加载到缓冲区→程序从内存读取数据3、本次案例包含两部分缓存流写入文件注释代码、缓存流循环读取文件并展示到窗体标题。三、完整源代码using System; using System.IO; using System.Text; using System.Windows.Forms; namespace _3BufferedStream { public partial class Form1 : Form { public Form1() { InitializeComponent(); //BufferedStream:缓存区文件读写操作主要把本地数据读取到缓存区里面 //后续读取直接读取缓存区数据减少磁盘IO操作提高读写速度 #region 【缓存流写入注释部分】 ////1.创建缓存流对象包裹创建文件的文件流 //BufferedStream buffer new BufferedStream(File.Create(1.txt)); ////2.字符串转为字节数组 //byte[] bs Encoding.Default.GetBytes(主要把本地数据读取到缓存区里面); ////3.向缓冲区写入数据 //buffer.Write(bs, 0, bs.Length); ////4.Flush强制刷新缓冲区将缓存数据写入硬盘 //buffer.Flush(); ////5.关闭缓存流 //buffer.Close(); #endregion #region 【缓存流读取主代码】 //1.创建只读文件流并包裹为缓存流对象 BufferedStream b1 new BufferedStream(File.OpenRead(1.txt)); //2.根据缓存流数据长度创建对应字节数组 byte[] bs new byte[b1.Length]; //3.定义空字符串用来拼接读取到的全部内容 string ss ; //4.循环读取缓冲区数据 //Read返回值0代表还读取到数据返回值0读取完毕 while (b1.Read(bs, 0, bs.Length) 0) { //字节数组转字符串累加保存 ss Encoding.Default.GetString(bs); //控制台打印读取内容方便调试查看 Console.WriteLine(Encoding.Default.GetString(bs)); } //5.将读取完整内容赋值给窗体标题 this.Text ss; //6.关闭缓存流释放文件占用 b1.Close(); #endregion } } }四、缓存流写入代码分步详解1、创建缓存流对象BufferedStream buffer new BufferedStream(File.Create(1.txt));File.Create(1.txt)创建文件流文件不存在新建存在则覆盖将文件流作为参数传入BufferedStream完成缓存流绑定实现缓存读写。2、字符串转字节数组byte[] bs Encoding.Default.GetBytes(主要把本地数据读取到缓存区里面);计算机底层只能识别字节所有写入缓存/文件的字符串必须转为byte字节数组。3、Write写入缓冲区buffer.Write(bs, 0, bs.Length);将字节数组数据写入内存缓冲区此时数据暂时保存在内存并未直接写入硬盘。4、Flush刷新缓冲区重点buffer.Flush();作用强制将内存缓冲区中所有暂存的数据一次性写入本地硬盘如果不调用Flush数据只会停留在内存不会保存到文件。5、Close关闭流关闭缓存流解除程序对文件的占用同时自动清空缓冲区资源。五、缓存流读取代码分步详解1、初始化只读缓存流BufferedStream b1 new BufferedStream(File.OpenRead(1.txt));File.OpenRead打开文件并生成只读文件流只能读取不能写入外层包裹BufferedStream启用缓存读取模式优化读取效率。2、创建字节缓存数组byte[] bs new byte[b1.Length];根据缓存流内部数据总长度创建匹配大小的字节数组用来接收读取的数据。3、while循环读取数据while (b1.Read(bs, 0, bs.Length)0)Read方法返回值含义返回值 0成功读取到字节数据继续循环读取返回值 0文件数据全部读取完毕结束循环。4、字节数组还原字符串ss Encoding.Default.GetString(bs);将每次循环读取到的字节数组还原为字符串并累加最终拼接成完整文件内容。5、数据展示与关闭流this.Text ss将读取完整的文件内容赋值给窗体标题进行展示b1.Close()读取完成关闭缓存流释放文件与内存资源。六、核心方法解析1、Write(字节数组,起始下标,长度)向内存缓冲区写入字节数据2、Read(字节数组,起始下标,长度)从缓冲区读取数据存入数组返回真实读取字节数3、Flush()强制刷新缓冲区将内存数据落地保存到硬盘4、Close()关闭缓存流释放所有资源。七、BufferedStream优点1、减少硬盘IO访问次数批量读写避免频繁操作硬盘2、读写效率更高内存读写速度远远快于硬盘读写速度3、延长硬盘寿命降低硬盘频繁读写造成的硬件损耗4、适配大文件大文件读写优先推荐使用缓存流。八、知识点总结1、BufferedStream是FileStream的包装类必须依赖文件流才能使用2、核心原理利用内存缓冲区中转数据减少磁盘访问次数3、写入数据必须调用Flush()否则数据仅保存在内存无法保存到文件4、采用while循环读取文件适配任意大小文件避免数据读取不全5、流对象使用完毕必须Close关闭防止文件被程序锁定占用。九、易错点1、写入缓存流忘记调用Flush()数据丢失文件为空2、OpenRead只能读取不能写入强行写入直接报错3、读取文件时文件路径错误、文件不存在程序抛出异常4、不使用循环读取大文件容易出现数据读取残缺5、混淆缓冲区与文件缓冲区在内存断电数据直接清空。————————File类——————————一、知识点介绍1、File类属于静态类位于System.IO命名空间所有方法全部为静态方法不需要实例化对象直接通过类名调用。2、分工区别Directory专门用来操作文件夹File专门用来操作文件支持文件创建、删除、复制、移动、一键读写、追加内容。3、优缺点File类写法简单一行代码即可完成读写适合小型文本文件底层一次性加载全部数据不适合超大文件大文件建议使用FileStream缓存流。二、完整源代码namespace _5File类 { public partial class Form1 : Form { public Form1() { InitializeComponent(); //所有代码下面分段逐一讲解 } } }三、第一段整体文本读写 WriteAllText / ReadAllText//写入完整文本 File.WriteAllText(1.txt,dsdssdfsfdfddsdd是多少,Encoding.Default); //读取完整文本 MessageBox.Show(File.ReadAllText(1.txt,Encoding.Default));1、WriteAllText覆盖写入作用快速向文件写入字符串内容文件不存在自动创建文件已存在直接覆盖原有全部内容。参数1文件相对路径参数2需要写入的文本内容参数3编码格式。2、ReadAllText整体读取作用读取目标文件中所有内容整体返回为一个字符串适合读取单行、简单文本。四、第二段数组分行读写 WriteAllLines / ReadAllLines//定义字符串数组 string[] contents { 张三丰, 杨过 }; //将数组换行写入文件 File.WriteAllLines(2.txt,contents); //读取文件按行转为数组 string[] ss File.ReadAllLines(2.txt); foreach(string s in ss) { MessageBox.Show(s); }1、WriteAllLines接收字符串数组自动将数组里面的每一个元素单独占一行写入文件自动换行适合多条数据存储。2、ReadAllLines读取文件所有内容文件的每一行对应数组中的一个元素返回字符串数组一般搭配foreach循环遍历读取每一行数据。五、第三段字节形式读写 WriteAllBytes / ReadAllBytes//字节形式写入 File.WriteAllBytes(3.txt, Encoding.Default.GetBytes(dsdfdf颠三倒四)); //字节形式读取 MessageBox.Show(Encoding.Default.GetString(File.ReadAllBytes(3.txt)));原理和FileStream原理一致以字节数组方式读写数据。特点适用性最强不仅能读写txt文本还可以读写图片、音频、视频等所有类型文件。写入字符串转字节数组读取字节数组还原为字符串。六、第四段基础文件操作增、删、复制、剪切、判断File.Create(4.txt); //创建空白文件 File.Delete(4.txt); //删除指定文件 File.Move(4.txt,../5.txt); //剪切/移动文件 File.Copy(../5.txt, 6.txt); //复制文件 File.Exists(6.txt); //判断文件是否存在1、Create()创建一个空白文件返回FileStream文件流对象2、Delete()永久删除文件删除后无法从回收站恢复3、Move()剪切文件既可以移动文件位置也可以用于重命名文件4、Copy()复制一份一模一样的文件5、Exists()判断文件是否存在返回布尔值true / false防止路径报错。七、第五段AppendText 追加写入重点//获取程序当前运行绝对路径 Directory.GetCurrentDirectory(); //打开文件并开启追加模式 StreamWriter sw File.AppendText(6.txt); //在文件末尾追加写入内容 sw.Write(Directory.GetCurrentDirectory()); //关闭写入流释放资源 sw.Close();1、WriteAllText 属于覆盖写入会清空旧数据AppendText为追加写入不会覆盖原有内容在文件末尾新增数据。2、File.AppendText()打开指定文件返回StreamWriter写入对象。3、Directory.GetCurrentDirectory()获取当前程序Debug运行目录的绝对路径。4、sw.Write()向文件末尾写入内容使用完毕必须Close()关闭流防止文件被占用。八、知识点总结1、File是静态类无需new对象直接类名调用方法2、WriteAllText覆盖写入普通文本ReadAllText读取全部文本3、WriteAllLines数组分行写入ReadAllLines按行读取返回数组4、WriteAllBytes字节读写支持所有格式文件5、Create/Delete/Copy/Move/Exists 完成文件基础增删复制移动6、AppendText实现追加写入解决覆盖旧数据的问题结尾必须关闭流。StreamReader与StreamWriter 读写流一、知识点概述StreamWriter 和 StreamReader 专门用于纯文本文件的读写操作位于System.IO命名空间。1、StreamWriter文本写入流专门用来写入字符串支持换行写入底层自动封装FileStream不需要手动转换字节数组2、StreamReader文本读取流专门用来读取文本文件一般采用while循环按行读取3、特点按行读写、内存占用小、适合大文本优于File类File一次性加载全部内容容易内存溢出。二、完整源代码using System; using System.IO; using System.Windows.Forms; namespace _6StreamReader_StreamWriter { public partial class Form1 : Form { public Form1() { InitializeComponent(); #region 【StreamWriter 写入注释代码】 ////1.创建文本写入流对象 //StreamWriter sw new StreamWriter(1.txt); ////2.定义数组数据 //string[] names { 张三, 李四 }; ////3.遍历数组逐行写入文件 //foreach (string name in names) //{ // sw.WriteLine(name); //} ////4.关闭写入流 //sw.Close(); #endregion #region 【StreamReader 读取运行代码】 //1.创建文本读取流对象打开指定文件 StreamReader sr new StreamReader(1.txt); //2.定义空字符串用来接收每一行读取的数据 string str string.Empty; //3.循环按行读取文件 while ((str sr.ReadLine()) ! null) { //弹窗显示每一行内容 MessageBox.Show(str); } //4.关闭读取流 sr.Close(); #endregion } } }三、第一部分StreamWriter 文本写入分段拆解1、创建写入流对象StreamWriter sw new StreamWriter(1.txt);传入文件路径自动创建FileStream文件不存在自动新建文件存在默认覆盖原有内容。2、定义需要写入的数据string[] names { 张三, 李四 };定义字符串数组存储多条需要写入文件的文本数据。3、foreach遍历 WriteLine换行写入foreach (string name in names) { sw.WriteLine(name); }WriteLine()写入内容并自动换行区别Write()只写入内容不会自动换行。4、关闭流资源sw.Close();释放文件占用保存数据防止文件被程序锁定。四、第二部分StreamReader 文本读取分段拆解1、创建读取流StreamReader sr new StreamReader(1.txt);根据路径打开文本文件创建只读读取流只能读取文本不能读取图片、视频。2、定义接收变量string str string.Empty;定义空字符串专门用来接收ReadLine读取到的每一行数据。3、while循环读取核心重点while ((str sr.ReadLine()) ! null)ReadLine()每次只读一行数据读取规则读取到内容返回当前行字符串读取完毕没有数据返回null循环逻辑先读取赋值给str再判断是否等于null不等于null就继续读取。4、展示数据MessageBox.Show(str);将每一行读取到的数据弹窗展示。5、关闭读取流sr.Close();读取完成必须关闭流解除程序对文件的占用。五、核心方法总结StreamWriter写入1、Write()写入内容不换行2、WriteLine()写入内容自动换行3、Close()关闭写入流保存资源。StreamReader读取1、ReadLine()读取单行数据读完返回null2、ReadToEnd()一次性读取全部文本3、Close()关闭读取流。六、File类 VS Stream读写类1、File类一行代码读写简单粗暴一次性加载全部内容适合小文件2、StreamWriter/StreamReader按行读写内存占用极小专门适合大文本文件。七、易错点1、StreamWriter默认覆盖文件内容想要追加内容需要重载构造函数2、ReadLine只能读取文本不能读取二进制文件3、while循环判断不能写反必须判断 ! null4、读写结束不Close文件会被进程占用无法删除修改5、编码不一致会出现中文乱码。