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);
}