9.1文件读取和写入
文件读写:读写文本文件最常用的类有FileStream(文件流)、StreamReader(流读取器)、StreamWrite(流写入器)。
读写文件操作的基本步骤:
1、创建文件流。
2、创建读、写器。
3、执行读、写操作。
4、关闭读、写器。
5、关闭文件流。
注意:文本文件的编码使用UTF-8或Unicode格式。
代码示例:
//首先添加命名空间
using System.IO;
//打开与保存
private void 控件名_Click(object sender,EventArgs e){
//使用打开文件对话框选择文件
if(ofDlg.ShowDialog()==DialogResult.OK){
控件名.Text=ofDlg.FileName;
//创建文件流FileStream("保存的文件名",FileMode.Open(文件的打卡方式),FileAccess.Read(对文件的操作权限是读还是写还是读写));
FileStream fs=new FileStream(ofDlg.FileName,FileMode.Open,FileAccess.Read);
//创建读取器或者创建写入器
StreamReader str=new StreamReader(fs);//读取器
StreamWrite st=new StreamWrite(fs);//写入器
//读取文件内容或把文件写入文本
控件名.Text=str.ReadToEnd();//读取文件内容
st.Write(控件名.Text);//把文件写入文本
//关闭写入器或读取器
str.Close();//关闭写入器
st.Close();//关闭读取器
//关闭文件流
fs.Close();
}
}
语法:
FileStream fs=new FileStream(FileName,FileMode,FileAccess);
FileName是字符串类型,表示文件路径。
FileMode是枚举类型,用于指定打开文件的方式
FileMode的枚举值:
枚举值 | 说明 |
---|---|
CreateNew | 创建新文件,如果文件已存在,则引发异常 |
Create | 创建新文件,如果文件已存在,则覆盖 |
Open | 打开文件,如果文件不存在,则引发异常 |
OpenOrCreate | 打开文件,如果文件不存在,则创建新文件 |
Append | 打开文件并查找大文件尾,如果文件不存在,则创建新文件 |
Truncate | 打开当前文件并清空其内容,如果文件不存在,则引发异常 |
FileAccess是枚举类型,用于指定文件的访问方式
FileAccess的枚举值:
枚举值 | 说明 |
---|---|
Read | 对文件进行只读访问 |
Write | 对文件进行只写访问 |
ReadWrite | 对文件进行读写访问 |
注意:操作系统上直接创建的文本文件默认为ANSI编码,而StreamReader和StreamWrite默认使用UTF-8编码而不是当前系统的ANSI编码,所以在读写ANSI编码的文本文件时会显示为乱码。
StreamReader的常用方法:
方法 | 说明 |
---|---|
Read() | 读取输入流中的下一个(组)字符 |
ReadLine() | 读取当前流中的一行字符,并将数据作为字符串返回 |
ReadToEnd() | 读取从当前位置到末尾的所以字符,并将数据作为字符串返回 |
Close() | 关闭StreamReader对象和基础流,并释放与读取器关联的所有系统资源 |
StreamWriter的常用方法:
方法 | 说明 |
---|---|
Write() | 将数据写入流 |
WriteLine() | 将行结束符之前的数据写入流 |
Close() | 关闭StreamWriter对象和基础流 |
9.3序列化和反序列化:
概述:
序列化是指将对象实例的状态存储到存储媒体中的过程。.NET框架通过使用反射提供自动的序列化机制。对象序列化后,类的名称、程序集以及类实例化的所有数据成员均将被写入存储媒体中,当已序列化的对象被反序列化时,该对象将被重新创建,并自动还原所有数据成员的值,要序列化的对象需要标记为Serializable特性。
序列化与反序列化的应用:
将Customer类标记为Serializable特性,然后修改CustomerManager类中的Save()和Load()方法。
代码实例:
//标记Customer类为可序列化
[Serializable]
class Cuatomer{
private string name;
private int age;
private string tel;
private string address;
public string Name(){
get{return name;}
set{name=value;}
}
public int Age(){
get{return age;}
set{age=value;}
}
public string Tel(){
get{return tel;}
set{tel=value;}
}
public string Address(){
get{return address;}
set{address=value;}
}
}
//修改Save()和Load()方法.
//在CustomerManager类中引用Syatem.Runtime.Serialization.Formatter.Binay命名空间
class CustomerManager{
//保存用户
public void Save(Customer customer){
FileStream fs=new FilStream(customer.Name+".data",FileMode.Create,FlieAccess.Write);
BinayFormatter bf=new BinaryFormatter();
bf.Serialize(fs,customer);//序列化
fs.Close();
}
//读取用户
public Customer Load(string path){
Customer customer=new Customer();
FileStream fs=new FileStream(path,FileMode.Open,FileAccess.Read);
BinaryFormatter bf=new BinaryFormatter();
Cuatomer=bf.Deserialize(fs) as Customer;//反序列化
fs.Cloae();
return customer()
}
}
//序列化对象后反序列化读取并显示数据
static void Main(string[] arfs){
CustomerManager cm=new CustomerManager();
Customer chen=new Customer("王五",46,"139*********","中国");
//序列化对象
cm.Save(chen);
//方序列化对象
Customer stq=cm.Load("王五.date");
Console.WriteLine("姓名:"+stq.Name);
Console.WriteLine("年龄:"+stq.Age);
Console.WriteLine("电话:"+stq.Tel);
Console.WriteLine("地址:"+stq.Address);
}