C#面向对象程序设计(9)

内容纲要

9.1 文件读取和写入 

9.1.1 文件和流 

  • 计算机文件可以分为文本文件和二进制文件 
  • 文件是在各种媒介上永久存储的数据的有序集合,它是进行数据读写操作的基本对象 
  • 流是一种向存储器读取和写入字节的方式,也是进行数据读写操作的基本对象。流提供了连续的字节流存储空间,其实际存储位置可以不连续,在 C# 中所有表示流的类都继承于抽象类 Stream 

9.1.2 文件读写 

  1. 读写文本文件最常用的类有 FileStream(文件流)、StreamReader(流读取器)和 StreamWriter(流写入器) 
  2. 读写文件操作的基本步骤如下 
  • 创建文件流 
  • 创建读、写器 
  • 执行读、写操作 
  • 关闭读、写器 
  • 关闭文件流 

9.1.2 文件夹常用操作方法 

通过创建一个简单的文件读写器来熟悉文件读写的操作 

示例:

using System.IO;//引入IO的命名空间
private void btnOpen_Click(object sender, EventArgs e)
{
        if (ofDlg.ShowDialog() == DialogResult.OK)
        {
	txtPath.Text = ofDlg.FileName;
//1、创建文件流
	FileStream fs = new FileStream(ofDlg.FileName,FileMode.Open,FileAccess.Read);
	StreamReader sr = new StreamReader(fs);//2、创建读取器
	txtContent.Text=sr.ReadToEnd();//3、 读取文件内容
	sr.Close();//4、关闭读取器
	fs.Close();//5、关闭文件流
        }
}
private void btnSave_Click(object sender, EventArgs e)
{
         if (sfDlg.ShowDialog() == DialogResult.OK)
         {
//1、创建文件流
	FileStream fs = new FileStream(sfDlg.FileName, FileMode.Create, FileAccess.Write);
	StreamWriter sw = new StreamWriter(fs);//2、 创建写入器
	sw.Write(txtContent.Text);//3、把文本框中内容写入文件
	sw.Close();//4、关闭写入器
	fs.Close();//5、关闭文件流
         }
}

语法:

FileName 是字符串类型,表示文件路径

FileMode 是枚举类型,用于指定打开文件的方式 

FileStream fs = new FileStream(FileName, FileMode,FileAccess); 

FileMode 的枚举值如下 

  • CreateNew:创建新文件,如果文件已存在,则引发异常 
  • Create:创建新文件,如果文件已存在,则覆盖 
  • Open:打开文件,如果文件不存在,则引发异常 
  • OpenOrCreate:打开文件,如果文件不存在,则创建新文件
  • Append :打开文件并查找到文件尾,如果文件不存在,则创建新文件
  • Truncate:打开当前文件并清除其内容,如果文件不存在,则引发异常 

FileAcces的枚举值如下 

  • Read:创建新文件,如果文件已存在,则引发异常 
  • Write:创建新文件,如果文件已存在,则覆盖
  • ReadWrite:打开文件,如果文件不存在,则引发异常

StreamReader 的常用方法如下 

  • Read():读取输入流中的下一个(组)字符
  • ReadLine():读取当前流中的一行字符,并将数据作为字符串返回 
  • ReadToEnd():读取从当前位置到末尾的所有字符,并将数据作为字符串返回
  • Close() :关闭 StreamReader 对象和基础流,并释放与读取器关联的所有系统资源

StreamWriter 的常用方法如下 

  • Write() :将数据写入流
  • WriteLine() :将行结束符之前的数据写入流
  • Close() :关闭 StreamWriter 对象和基础流

9.2 文本文件的局限性 

9.2.1 文本文件介绍 

  • 文本文件是微软在操作系统上附带的一种文本格式,是最常见的一种文件格式,早在 DOS 时代应用就很多,主要用于存储文本信息,即文字信息 
  • 微软在操作系统中直接保存,大多数软件可以直接查看文本文件 

9.2.2 结构化数据存储 

使用文本文件存储用户信息 

示例:

class CustomerManager
{
//客户管理类中保存客户的方法
         public void Save(Customer customer)
         {
	FileStream fs = new FileStream(customer.Name + ".txt", FileMode.Create, FileAccess.Write);
	StreamWriter sw = new StreamWriter(fs);
	sw.WriteLine(customer.Name);
	sw.WriteLine(customer.Age);
	sw.Close();
	fs.Close();
         }
}

//客户管理类中读取客户的方法
class CustomerManager
{
        public Customer Load(string path)
        {
	Customer customer = new Customer();
	FileStream fs = new FileStream(path, FileMode.Open, FileAccess.Read);
	StreamReader sr = new StreamReader(fs);
	customer.Name = sr.ReadLine();
	customer.Age = Convert.ToInt32(sr.ReadLine());
	sr.Close();
	fs.Close();
	return customer;
        }
}
static void Main(string[] args)
{
//保存客户陈天桥的信息到文本文件中
        CustomerManager cm = new CustomerManager();
        Customer chen = new Customer(" 陈天桥 ",46);
        cm.Save(chen);
}

随着业务的增加,当我们需要保存客户更多的信息时,如还需要保存客户的电话号码和住址,那么就需要更改Save() 和 Load() 方法内的代码 

每次修改对象的信息都需要再次修改保存和读取的方法,扩展功能非常麻烦 

示例:

public void Save(Customer customer)
{
        //其余代码省略…
        sw.WriteLine(customer.Tel);
        sw.WriteLine(customer.Address);//添加新的属性,写入文本

}

public void Save(Customer customer)
{
        //其余代码省略…
       customer.Tel = sr.ReadLine();
       customer.Address = sr.ReadLine();//读取的时候添加新的属性,此处读取和写入的顺序必须相同
}
static void Main(string[] args)
{
        CustomerManager cm = new CustomerManager();
        Customer chen = cm.Load(" 陈天桥 .txt");
        Console.WriteLine(" 姓名:" + chen.Name);
        Console.WriteLine(" 年龄:" + chen.Age);
        Console.WriteLine(" 电话:" + chen.Tel);
        Console.WriteLine(" 住址:" + chen.Address);
}

9.3 序列化和反序列化 

9.3.1 序列化与反序列化概述 

  • 序列化是指将对象实例的状态存储到存储媒体中的过程 
  • .NET 框架通过使用反射提供自动的序列化机制 
  • 对象序列化后,类的名称、程序集以及类实例的所有数据成员均被写入存储媒体中 
  • 当已序列化的对象被反序列化时,该对象将被重新创建,并自动还原所有数据成员的值。要序列化的对象需要标记为 Serializable 特性 

9.3.2 序列化与反序列化应用 

序列化需要将实体类标记为Serializable 

示例:

//可序列化实体需要添加Serializable特性
[Serializable]
class Customer
{
}


class CustomerManager
{
//Customer保存的方法
          public void Save(Customer customer)
          {
	FileStream fs = new FileStream(customer.Name + ".data", FileMode.Create, FileAccess.Write);
	BinaryFormatter bf = new BinaryFormatter();
	bf.Serialize(fs, customer); //序列化
	fs.Close();
           }
}
class CustomerManager
{
//Customer读取的方法
        public Customer Load(string path)
        {
	Customer customer = new Customer();
	FileStream fs = new FileStream(path, FileMode.Open, FileAccess.Read);
	BinaryFormatter bf = new BinaryFormatter();
	customer = bf.Deserialize(fs) as Customer; //反序列化
	fs.Close();
	return customer;
        }
}


static void Main(string[] args)
{
        CustomerManager cm = new CustomerManager();
        Customer chen = new Customer(" 王五 ", 46, "138*****246", " 中国 ");
        cm.Save(chen);
        Customer ctq = cm.Load(" 王五 .data");
        Console.WriteLine(" 姓名:" + ctq.Name);
        Console.WriteLine(" 年龄:" + ctq.Age);
        Console.WriteLine(" 电话:" + ctq.Tel);
        Console.WriteLine(" 住址:" + ctq.Address);
}

将学生信息序列化为文件 

示例:

[Serializable]
public class Student
{
          private string name;
          private DateTime birthday;
          private string sex;
          private string classes;
          private string address;
          private Image photo;
         //构造方法与属性封装省略…
}

//Student类的保存方法
private void btnSubmit_Click(object sender, EventArgs e)
{
          //其余代码省略…
          FileStream fs = new FileStream("student.data",FileMode.Open, FileAccess.Write);
          BinaryFormatter bf = new BinaryFormatter();
          bf.Serialize(fs, studentList); //将Student序列化保存在文件中
          fs.Close();
          MessageBox.Show(" 添加成功。");
          this.Close();
}

总结:

  1. 读写文件操作的基本步骤 
  • 创建文件流
  • 创建读、写器
  • 执行读、写操作
  • 关闭读、写器
  • 关闭文件流 
  • 对象序列化后类的名称、程序集以及类实例的所有数据成员均被写入存储媒体中 
  • 使用Serializable特性表示类可以被序列化

 

给TA打赏
共{{data.count}}人
人已打赏
C#

C#面向对象程序设计(8)

2022-8-16 19:12:04

C#

c#面试题及答案整理

2022-8-23 14:16:05

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
今日签到
有新私信 私信列表
搜索