一、核心知识点概述
默认情况下:对象存在内存中,程序关闭数据直接丢失。
解决方案:对象持久化存储------将自定义对象的属性数据,通过 IO 流写入本地文本文件,下次打开程序可以重新读取还原对象数据。
本次案例使用:FileStream + StreamWriter + StreamReader 实现对象读写,同时演示 传统手动释放 和 using自动释放 两种写法。
必备命名空间:using System.IO;
二、自定义实体类(Model)
创建 People 实体类,封装用户信息字段,用于实例化对象存储数据。
cs
// 自定义人类实体
public class People
{
public string Name { get; set; }
public string Age { get; set; }
public string Sex { get; set; }
public string Phone { get; set; }
}
三、对象数据写入本地文件(传统写法:手动Close/Dispose)
1. 实现思路
-
- 接收文本框数据,实例化 People 对象
-
- 创建 FileStream 文件通道(创建模式,覆盖旧文件)
-
- 绑定 StreamWriter 文本写入器
-
- 逐行写入对象的每一个属性
-
- 先关外层工具、再关文件流,手动释放资源
2. 完整写入代码
cs
// 对象数据写入本地文件
private void button1_Click(object sender, EventArgs e)
{
// 1. 实例化对象,接收页面输入数据
People p = new People()
{
Name = textBox1.Text,
Age = textBox2.Text,
Sex = textBox3.Text,
Phone = textBox4.Text
};
// 2. 创建文件流:创建文件,覆盖原有内容,只写权限
FileStream fs = new FileStream(@"1.txt", FileMode.Create);
// 3. 文本写入器绑定文件流
StreamWriter sw = new StreamWriter(fs);
// 4. 逐行写入对象属性(一行存储一个字段)
sw.WriteLine(p.Name);
sw.WriteLine(p.Age);
sw.WriteLine(p.Sex);
sw.WriteLine(p.Phone);
// 5. 关闭 + 释放资源(顺序不能乱)
sw.Close();
fs.Close();
sw.Dispose();
fs.Dispose();
}
3. 重点说明
-
FileMode.Create:有文件覆盖、无则新建,适合保存最新数据 -
WriteLine():自动换行,读取时可以按行精准匹配字段 -
释放顺序:先StreamWriter 后 FileStream,顺序颠倒会报错/资源残留
四、本地文件读取还原对象(using自动释放写法)
1. 实现思路
-
- 声明空的 People 对象,用于接收数据
-
- using 包裹文件流,自动释放资源
-
- StreamReader 逐行读取文本
-
- 按写入顺序给对象属性赋值,还原对象
-
- 将对象数据回显到文本框
2. 完整读取代码
cs
// 读取文件,还原对象数据
private void button2_Click(object sender, EventArgs e)
{
// 声明空对象
People p1 = new People();
// using 自动释放文件流资源
using (FileStream fs = new FileStream(@"1.txt", FileMode.Open))
{
StreamReader sr = new StreamReader(fs);
// 严格按照【写入顺序】逐行读取赋值
p1.Name = sr.ReadLine();
p1.Age = sr.ReadLine();
p1.Sex = sr.ReadLine();
p1.Phone = sr.ReadLine();
}
// 数据回显到页面
textBox1.Text = p1.Name;
}
3. using 核心优势
-
无需手动写 Close()、Dispose()
-
代码执行出大括号,自动释放文件流资源
-
杜绝文件占用、内存泄漏,企业开发首选
五、多种IO写入方式对比(你源码注释总结)
cs
// 1. File静态类:极简读写,无需创建流对象
File.WriteAllText();
File.ReadAllText();
// 2. 高级流(必须依赖文件流对象)
FileStream fs; // 基础字节流
StreamReader/StreamWriter; // 文本专用读写流
BinaryReader/BinaryWriter; // 二进制读写流
BufferedStream; // 缓存加速流
六、必考核心规则(对象存储重中之重)
1. 读写顺序必须严格一致
写入顺序:Name → Age → Sex → Phone 读取顺序:必须完全对应,顺序错乱导致属性赋值错乱、数据串位
2. 持久化本质
不能直接保存对象,只能保存对象的属性数据,读取时重新 new 对象、手动赋值还原。
3. 两种资源释放方式区别
-
传统写法:手动 Close + Dispose,繁琐、容易遗漏
-
using写法:自动释放,安全简洁,推荐首选
七、高频易错点
-
读取行数少于写入行数:报空引用异常
-
读写顺序不匹配:数据错乱、属性赋值错误
-
忘记释放流资源:文件被占用,无法二次写入
-
FileMode.Create 会清空旧数据,如需累加不能使用该模式
八、背诵口诀
对象内存不持久,IO写入保本地;
流道File建通道,Writer逐行写属性;
Reader按序读数据,新建对象赋值齐;
Using自动释资源,顺序对应不偏移。