C# 自定义对象 本地持久化存储(写入/读取)完整笔记

一、核心知识点概述

默认情况下:对象存在内存中,程序关闭数据直接丢失

解决方案:对象持久化存储------将自定义对象的属性数据,通过 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. 实现思路

    1. 接收文本框数据,实例化 People 对象
    1. 创建 FileStream 文件通道(创建模式,覆盖旧文件)
    1. 绑定 StreamWriter 文本写入器
    1. 逐行写入对象的每一个属性
    1. 先关外层工具、再关文件流,手动释放资源

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. 实现思路

    1. 声明空的 People 对象,用于接收数据
    1. using 包裹文件流,自动释放资源
    1. StreamReader 逐行读取文本
    1. 按写入顺序给对象属性赋值,还原对象
    1. 将对象数据回显到文本框

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自动释资源,顺序对应不偏移。