C#中的檔案流總結
檔案讀寫
C#和java對於檔案的操作的思路有點相似,都是採用管道技術和流操作—Stream來實現相應的功能.,開始操作檔案的時候用到檔案專用流:System.IO名稱空間下的Filestream.,其建構函式有很多,現在先介紹一個很常用的方法:
FileStream 建構函式 (String, FileMode);
FileMode有:open,create,openOrcreate,createnew.append, Truncate等幾種模式.
下面先看一個例子:
FileInfo mynewfile = new FileInfo("C:\\myfile.txt");//
FileStream sf = new FileStream(mynewfile.ToString(), FileMode.Create);//建構函式,以建立模式開啟目標檔案,如果不存在就建立相應的檔案.
byte[] dataArray = new byte[100000];//位元組
new Random().NextBytes(dataArray);//建立隨機位元組
for (int i = 0; i < dataArray.Length; i++)
{
sf.WriteByte(dataArray[i]);//將位元組寫入檔案理.
}
其他構造方法有:
我在這裡就不多介紹了,大家可以參考Msdn的檔案.關於檔案的讀寫還有個更好的StreamWriter/和StreamReader.下一節將繼續介紹.
FielStream類操作的是位元組和位元組陣列,字元資料易於使用,但是有些操作,比如隨機檔案訪問(訪問檔案中間某點的資料),就必須由FileStream物件執行。
FielStream類維護內部檔案指標,該指標指向檔案中進行下一次讀寫操作的位置。
FileStream只能處理原始位元組(raw byte),處理原始位元組的功能使用FileStream類可以用於處理任何資料檔案
一. FileStream詳解
1. (FileStream fs1 = File.Open("c:\\test.txt", FileMode.Open));
FileMode.Open 直接用FileStream類開啟檔案c:\\test.txt",
2. (FileStream fs2 = File.Open("c:\\test.txt", FileMode.Append, FileAccess.Write));
FileMode.Append,以追加的方式開啟檔案"c:\\test.txt",將某些內容寫到"c:\\test.txt"裡.
3.(FileStream fs3 =File.Open("c:\\test.txt", FileMode.Truncate, FileAccess.ReadWrite, FileShare.Read)).
FileMode.Truncate的意思是將檔案開啟清空裡面的內容後再對檔案進行操作..
4. FileStream MyFileStream1 = new FileStream(@"c:\Testing.txt", FileMode.Create);
這個方法的意思是建立一個可以讀寫的檔案,並且可以允許其他人讀取檔案的內容.
二. C#基於流的輸入輸出.
C#基於流的輸入輸出.:Stream-通過C# I/O 系統與物理裝置連線起來,也就是平時讀寫的硬碟等物理存貯裝置.流/Stream的方法和屬性有:
Method/ Properties 描述
void Close() 關閉流
void Flush() 清理流中的內容
int ReadByte() 返回一個整數表示輸入的位元組數,如果沒有資料返回-1
int Read(byte[ ] buf,int offset, int numBytes) 將numBytes個位元組讀入到byte[ ]的以offset為,起始位置,返回讀入成功的位元組數
Long Seek(long offset,SeekOrigin origin) 將當前位置定位到以origin為初始位置以後的offset處.
void WriteByte(byte b) 將單個位元組寫入到一個輸出流.
void Write(byte[ ] buf,int offset, int numBytes) 寫入byte[ ] buf中從offset開始的numBytes個位元組.
bool CanRead 是否可讀
bool CanSeek 是否支援定址
bool CanWrite 是否可以寫入資料
long Length 流的長度
long Position 流的當前位置.
三. 流的繼承結構
Stream是一個很大類的,在讀寫檔案的時候,可以通過不同的流進行專業的資料讀寫.
The FileMode and FileAccess的幾條規則:
Value 意義
FileMode.Create 建立檔案,之前存在同名的檔案將被毀掉
FileMode.CreateNew 建立新檔案,這個檔案之前不存在
FileMode.Open 開啟已經存在的檔案
FileMode.OpenOrCreate 開啟檔案如果存在,否則建立新檔案
FileMode.Truncate 開啟以存在的檔案,將它的內容清除掉
FileMode.Append 以追加的形式將資料寫入到檔案的最後
如果在開啟檔案的時候想限制檔案訪問許可權,那麼可以做如下的構造方法:
FileStream(string filename, FileMode mode, FileAccess access);
檔名 檔案模式 操作模式
Access可以是以下當中的一個值:
FileAccess.Read/ FileAccess.Write/ FileAccess.ReadWrite;
FileStreamfs=new FileStream(“c:\\tab.txt”,FileMode.OpenOrCreate,FileAccess.Read);
C#中的StreamReader/StreamWriter
在讀寫檔案的過程中,Filestream只可以進行以位元組為單位原始資料流進行讀寫操作,為此,C#中提供了功能更加強大的StreamReader/ StreamWriter來支援檔案的讀寫. StreamReader/ StreamWriter可以進行以字元為單位的資料讀寫操作..
一. 用StreamReader的建構函式
StreamReader有很多的建構函式:在這裡只列出兩個常用和比較常見的
StreamReader sr=new StreamReader (Stream); Stream可以是Filestream;
StreamReader sr=new StreamReader (String); String為指定的檔名初始化 StreamReader 類的新例項。
例如:
//demo1
FileStream filest = new FileStream(@"c:\abc.txt", FileMode.Open, FileAccess.ReadWrite); StreamReader sr = new StreamReader(filest);
//demo2
StreamReader another = new StreamReader(@"c:\abc.txt");
兩個StreamReader都指向同一個檔案.
StreamReader讀取檔案中的資料的程式碼:
FileStream filest = new FileStream(@"c:\abc.txt", FileMode.Open, FileAccess.ReadWrite);
StreamReader sr = new StreamReader(filest);
string strLine = sr.ReadLine();//讀取檔案中的一行
while(strLine!=null)//判斷是否為空,表示到檔案最後一行了
{
Console.WriteLine(strLine);
strLine = sr.ReadLine();
}
sr.Close();//關閉流
filest.Close();
程式執行結果和盤中abc.txt檔案中的內容比較如下:
二. StreamWriter
StreamWriter 專門用於的向檔案中寫資料的,它和StreamReader類似,只是一個負責向檔案中寫資料,一個負責向檔案中讀資料而已.
StreamWriter 建構函式也有很多.在這裡只舉例兩個建構函式.
StreamWriter sr=new StreamWriter (Stream); Stream可以是Filestream;
StreamWriter sr=new StreamWriter (String); String為指定的檔名初始化StreamWriter 類的新例項。
例如:
//demo1
FileStream filest = new FileStream(@"c:\abc.txt", FileMode.Open, FileAccess.ReadWrite); StreamWriter sw = new StreamWriter (filest);
//demo2
StreamWriter another = new StreamWriter (@"c:\abc.txt");下面的例子可以讓大家掌握寫檔案的方法.
FileStream filewriter = new FileStream(@"C:\abc.txt", FileMode.Append, FileAccess.Write);
以追加的方式開啟檔案,並進行寫入操作.
StreamWriter sw = new StreamWriter(filewriter); 建構函式;
for (char mychar = 'a'; mychar <= 'z'; mychar++)
{
sw.Write(mychar);//將從a—z26個小寫字母寫入檔案中.
}
sw.Close();filewriter.Close();
//demo
FileStream filest = new FileStream(@"c:\abc.txt", FileMode.Open, FileAccess.ReadWrite);
StreamReader sr = new StreamReader(filest);
string strLine = sr.ReadLine();
while(strLine!=null)
{
Console.WriteLine(strLine);
strLine = sr.ReadLine();
}
sr.Close();
filest.Close();
這篇主要介紹幾個操作檔案流的類,讀寫類StreamReader,StreamWriter和File類以及Directory類的操作
FileStream類的控制
(1) Flush(); 清除此流的緩衝區,是為了保護硬碟
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
static void Main(string[] args) { using (FileStream filewrite = new FileStream("file.txt", FileMode.Create, FileAccess.Write)) { filewrite.WriteByte(101); filewrite.WriteByte(101); //清除此流的緩衝區 filewrite.Flush(); filewrite.WriteByte(101); filewrite.WriteByte(101); //每次寫一個直接就會頻繁的操作硬碟, } } |
(2)Seek(偏移,位置列舉)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
static void Main(string[] args) { using (FileStream fileRead = new FileStream("file.txt", FileMode.Open, FileAccess.Read)) { fileRead.Position = 4; fileRead.Seek(3, SeekOrigin.Current); int n = fileRead.ReadByte(); Console.WriteLine((char)n); } |
其它流
(1)MemoryStream 記憶體流
NetworkStream ns = new NetworkStream();
(2)NetworkStream 網路流
MemoryStream ms = new MemoryStream();
讀寫流
(1) StreamReader
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
//讀取檔案流 static void Main(string[] args) { using(FileStream fileRead=new FileStream("成功.txt",FileMode.Open,FileAccess.Read)) { using (StreamReader sr = new StreamReader(fileRead,Encoding.Default)) { //第一種讀法 //string str = sr.ReadLine(); //while ((str = sr.ReadLine()) != null) //{ // Console.WriteLine(str); //} //第二種讀法 Console.WriteLine(sr.ReadToEnd()); |