什麼是流?html
System.IO爲咱們提供了一個抽象類Stream。它在基礎序列數據源與應用程序之間架設起了流動的通道。數組
下表描述BinaryReader類經常使用的一些方法:緩存
下表描述BinaryWriter類的一些經常使用方法:網絡
Closeide |
關閉當前BinaryWriter和下層的流函數 |
Seek編碼 |
在當前流設置位置spa |
Write3d |
寫值到當前流code |
Flush |
清除當前writer的全部緩存,致使任何緩存的數據被寫入到下層的設備中 |
Stream類是IO名稱空間中最重要的類之一,它是派生FileStream、MemoryStream和BufferedStream等不一樣類的抽象類
Read() ----讀MemoryStream並裝值寫入緩衝區
ReadByte() ----從MemoryStream讀一個字節
Write() ----從緩衝區向MemoryStream寫值
WriteByte() ----從緩衝區向MemoryStream寫一個字節
WriteTo() ----將此內存流的內容寫入別一個內存流
public BufferedStream(Stream stName);
public BufferedStream(Stream stName, int bsize); // bsize表示緩衝區大小
1 static void Main(string[] args) 2 { 3 MemoryStream memStr = new MemoryStream(); 4 BufferedStream buffStr = new BufferedStream(memStr); 5 buffStr.WriteByte((byte)100); 6 buffStr.Position = 0; //取得memStr的當前位置Positon屬性爲0,以便buffStr的當前位置設置爲流的開始
7 byte[] arrb = { 1, 2, 3 }; 8 buffStr.Read(arrb, 0, 1); // 用流的當前位置的值填充字節數組arrb
9 for (int i = 0; i < 3; i++) 10 { 11 Console.WriteLine("這個值是{0}", arrb[i]); 12 } 13 Console.WriteLine("ReadByte()的返回值是{0}", buffStr.ReadByte()); // 返回-1表示流的末尾
14 Console.ReadKey(); 15 }
FileStream(文件流)是Stream派生出的子類,使用這個類咱們能夠創建文件與程序的通道,對文件進行二進制數據的讀寫
FileStream 類用於對文件執行讀/寫操做,Read()和Write()方法用於讀/寫操做
FileStream類構造函數有許多重寫形式,以方便建立該類的實例
FileStream(string FilePath,FileMode)
FileStream(stirng FilePath,FileMode,FileAccess)
FileStream(string FilePath,FileMode,FileAccess,FileShare)
FileMode爲enum類型(建立或打開),其值以下:
Append:打開一個文件並查找到文件末尾,以便可以附加新的數據,若是文件不存在,則新建一個文件
Create:用指定名稱新建一個文件,若是存在具備相同名稱的文件,則覆蓋舊文件
CreateNew:新建一個文件
Open:打開一個文件,指定文件必須存在
OpenOrCreate:與Open相似,只是指定文件不存在時,新建一個
Truncate:根據此枚舉,打開指定文件並將之截斷爲0字節(大小爲0字節),文件必須存在
FileAccess枚舉值(讀寫權限):Read / Write / ReadWrite
FileShare枚舉值(共享):
None:謝絕共享當前文件。文件關閉前,打開該文件的任何請求都將失敗
Read:只能對文件進行讀取操做
Write:能夠對文件進行寫入操做
ReadWrite:能夠進行對文件的讀寫和寫入兩種操做
例1:
1 static void Main(string[] args) 2 { 3 4 5 //===============================寫入================================ 6 //使用FileStream讀寫文件 7 string path = @"e:\1.txt"; 8 9 Console.WriteLine("輸入你要寫入的文件內容:"); 10 string info = Console.ReadLine(); 11 //建立文件流,對str文件寫操做 12 FileStream fs = new FileStream(path, FileMode.Create, FileAccess.ReadWrite, FileShare.ReadWrite); 13 //把輸入的字符串解碼成字節數組 14 byte[] array = new UTF8Encoding(true).GetBytes(info);//UTF8編碼 15 16 //byte[] array = new ASCIIEncoding().GetBytes(info); 17 //寫入 18 fs.Write(array, 0, array.Length); 19 20 21 fs.Flush();//清空緩存區 22 fs.Close();//關閉流 23 24 Console.WriteLine("寫入成功"); 25 26 //===============================讀取================================ 27 28 FileStream fs1 = new FileStream(path, FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite); 29 //定義數組用於接收讀取的內容 30 byte[] arr = new byte[fs1.Length]; 31 //讀取 32 fs1.Read(arr, 0, arr.Length); 33 34 fs1.Close();//關閉流 35 36 Console.WriteLine("讀取到得內容以下:"); 37 Console.WriteLine(new UTF8Encoding(true).GetString(arr)); 38 }
例2:
1 static void Main(string[] args) 2 { 3 List<string> li = new List<string>(); 4 5 Console.WriteLine("-------------二進制文件寫入--------------------\n"); 6 Console.WriteLine("請輸入你的我的信息:"); 7 Console.Write("您的姓名:"); 8 li.Add(Console.ReadLine()); 9 Console.Write("你的年齡:"); 10 li.Add(Console.ReadLine()); 11 Console.Write("你的愛好:"); 12 li.Add(Console.ReadLine()); 13 Console.Write("你的說明:"); 14 li.Add(Console.ReadLine()); 15 16 string pathtxt = @"e:\10.text"; 17 string str = string.Empty; 18 19 FileStream sw = new FileStream(pathtxt, FileMode.Create, FileAccess.Write, FileShare.Write); 20 21 string str1 = ""; 22 foreach (string s in li) 23 { 24 str1 += s + "\r\n"; 25 } 26 byte[] b = UTF8Encoding.Default.GetBytes(str1); 27 sw.Write(b, 0, b.Length); 28 29 sw.Flush(); 30 sw.Close(); 31 32 Console.WriteLine("二進制文件寫入成功!"); 33 Console.WriteLine("-------------二進制文件讀取--------------------\n"); 34 Console.WriteLine("讀取二進制文件"); 35 FileStream file = new FileStream(pathtxt, FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite); 36 37 byte[] a = new byte[file.Length]; 38 while ((file.Read(a, 0, a.Length)) > 0) 39 { 40 Console.Write(UTF8Encoding.Default.GetString(a)); 41 } 42 file.Flush(); 43 file.Close(); 44 }
你寫了一個程序,其中要對硬盤上的一個文件操做,FileStream fs = new FileStream(fileName)
這樣就是創建了一個文件緩衝流,換句話的意思就是說你經過這條程序,計算機給了一塊內存空間,可是呢這塊內存
空間不是你想幹什麼就干涉麼的,他是專門存fileName這個文件裏面的內容的,內存空間的大小,和其餘信息,簡單地
操做時沒有辦法訪問的。當你要從文件裏面讀取一個Int整數的時候,程序作的不只僅是讀取一個int型整數,他會把該
數據附近的一大塊數據都讀出來放在剛纔的那塊空間中,爲何這麼作呢,由於CPU訪問硬盤比訪問內存慢多了,因此
一開始讀出不少的數據,後面須要使用的時候直接使用讀出來的,就防止了再次訪問硬盤。
相應的,你要網文件裏面寫入數據,也是先存到這個內存裏,等存的東西足夠多了,或者過了足夠的時間,系統一次性
把內容寫入硬盤。
TextReader類是StreamReader和StringReader類的抽象基類,可用於讀取有序的字符序列
Read() 讀取輸入流中的下一個字符或下一組字符
ReadLine() 從當前流中讀取一行字符並將數據做爲字符串返回
ReadToEnd() 從流的當前位置到末尾讀取流
1 class Program 2 { 3 static string ans = "y"; 4 static void Main(string[] args) 5 { 6 Console.WriteLine("1.讀取文件"); 7 Console.WriteLine("2.讀取字符串"); 8 try
9 { 10 Reading(); 11 } 12 catch (Exception ex) 13 { 14 Console.WriteLine(ex.Message); 15 Console.ReadKey(); 16 } 17 } 18 static void Reading() 19 { 20 if (ans == "Y" || ans == "y") 21 { 22 Console.Write("輸入你的選擇[1/2]:"); 23 int choice = Convert.ToInt32(Console.ReadLine()); 24 if (choice == 1) 25 { 26 Console.WriteLine("輸入文件名:"); 27 string filename = Console.ReadLine(); 28 if (!File.Exists(filename)) 29 { 30 Console.WriteLine(filename + "不存在!"); 31 return; 32 } 33 StreamReader sr = File.OpenText(filename); 34 string input; 35 while ((input = sr.ReadLine()) != null) 36 { 37 Console.WriteLine(input); 38 } 39 Console.WriteLine("已達到流末尾。"); 40 sr.Close(); 41 Console.Write("要繼續嗎?[Y/N]:"); 42 ans = Console.ReadLine(); 43 Reading(); 44 } 45 else if (choice == 2) 46 { 47 Console.Write("輸入字符串:"); 48 string str = Console.ReadLine(); 49 char[] b = new char[str.Length]; 50 StringReader sr = new StringReader(str); 51 sr.Read(b, 0, str.Length); 52 Console.WriteLine(b); 53 Console.WriteLine("要繼續嗎[Y/N]:"); 54 ans = Console.ReadLine(); 55 Reading(); 56 } 57 else
58 { 59 Console.WriteLine("輸入1或2做爲選擇:"); 60 } 61 } 62 } 63 }
TextWrite類用於編寫有序字符的類的抽象基類。StreamWriter和StringWriter類是TextWriter類的兩個派生類
Write() 將數據寫入流
WriteLine() 將數據寫入流,並在結尾標記結束符
StringWriter類用於裝數據寫入字符串,與StreamWriter類相似,區別僅在於它是向字符串(而不是向流)寫入
1 class Program 2 { 3 static string ans = "y"; 4 static void Main(string[] args) 5 { 6 Writing(); 7 } 8 static void Writing() 9 { 10 if (ans == "Y" || ans == "y") 11 { 12 Console.WriteLine("輸入文件名:"); 13 string filename = Console.ReadLine(); 14 if (!File.Exists(filename)) 15 { 16 Console.WriteLine(filename + "不存在!"); 17 return; 18 } 19 StreamWriter sr = File.AppendText(filename); 20 Console.Write("輸入要寫入的字符串:"); 21 string str = Console.ReadLine(); 22 sr.WriteLine(str); 23 sr.Close(); 24 Console.Write("要繼續嗎?[Y/N]:"); 25 ans = Console.ReadLine(); 26 Writing(); 27 } 28 } 29 }
下表描述了StreamReader類的通用方法:
方法 | 描述 |
Close |
關閉StreamReader類的對象和相應的流,而且釋放與reader相關的任何系統資源 |
Peek |
返回下一個可用的字符但不消費它 |
Read |
從流中讀取下一個字符或下一個字符集 |
ReadLine |
從當前流讀取一行字符,而且返回數據爲字符串 |
Seek |
容許在文件內移動讀/寫位置到任何地方 |
StreamWriter 類
下表描述了StreamWriter類的一些經常使用的方法:
方法 | 描述 |
Close |
關閉當前StreamWriter的對象和相應的流 |
Flush |
清除當前writer的全部緩衝,致使任何緩衝的數據被寫入相應的流 |
Write |
寫入流 |
WriteLine |
經過覆蓋參數寫入指定數據,在行的最後 |
1 static void Main(string[] args) 2 { 3 string path = @"e:\1.txt"; 4 5 //建立寫文本文件,並贊成追加 6 StreamWriter sw = new StreamWriter(path, true); 7 //逐行寫入 8 sw.WriteLine("編號:"); 9 sw.WriteLine("姓名:"); 10 sw.WriteLine("性別:"); 11 sw.WriteLine("地址:"); 12 sw.WriteLine("電話:"); 13 sw.WriteLine(); 14 15 sw.Flush();//清除當前緩衝區 16 sw.Close();//關閉流 17 // Process.Start("notepad.exe", path);//打開記事本 18 19 //StreamReader和StreamWriter讀取文本文件 20 StreamReader sr = new StreamReader(@"e:\1.txt", Encoding.UTF8); 21 22 string s = string.Empty; 23 while ((s = sr.ReadLine()) != null) 24 { 25 //string s = sr.ReadLine(); 26 Console.WriteLine(s); 27 } 28 }
流的寫入用完後必定要記得Flush(清緩衝)同時若是不用流的話,把相應的流Close(關閉)!
Flush的做用就是強制執行了一次把數據寫出硬盤,這樣,你寫入的數據確實到了文件中,不然若是程序忽然中斷,你 要寫入的內容也許還沒寫到文件中,就形成了數據丟失。