文件及IO操做(三)

什麼是流?html

  • 文件的數據從存儲介質到內存再到程序程序,以及這個反向的過程裏數據彷彿在一個通道中流動,咱們把這個通道成爲流。

                           

  • 按照輸入源的不一樣流分爲文件流、內存流、網絡流等。

System.IO爲咱們提供了一個抽象類Stream。它在基礎序列數據源與應用程序之間架設起了流動的通道。數組

常見操做:
  • Read:讀出流中的數據。
  • Write: 向數據源中寫入數據。
  • Seek: 在流中定位。

BinaryReader 和 BinaryWrite類,以二進制格式操做數據

    下表描述BinaryReader類經常使用的一些方法:緩存

  1. colse:關閉當前讀者和相應的流
  2. Read:從下層流讀取字符,而且增長流的當前位置

下表描述BinaryWriter類的一些經常使用方法:網絡

Closeide

關閉當前BinaryWriter和下層的流函數

Seek編碼

在當前流設置位置spa

Write3d

寫值到當前流code

Flush

清除當前writer的全部緩存,致使任何緩存的數據被寫入到下層的設備中 

Stream類

Stream類是IO名稱空間中最重要的類之一,它是派生FileStream、MemoryStream和BufferedStream等不一樣類的抽象類

MemoryStream類用於向內存(而不是磁盤)讀寫數據

  Read() ----讀MemoryStream並裝值寫入緩衝區
  ReadByte() ----從MemoryStream讀一個字節
  Write() ----從緩衝區向MemoryStream寫值
  WriteByte() ----從緩衝區向MemoryStream寫一個字節
  WriteTo() ----將此內存流的內容寫入別一個內存流

BufferedStream類用於對緩衝區進行讀/寫,有兩個構造函數

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         }
View Code

FileStream類

FileStream(文件流)是Stream派生出的子類,使用這個類咱們能夠創建文件與程序的通道,對文件進行二進制數據的讀寫

    • Stream類被用來從文本文件中讀取和寫入數據。
    • 它是一個抽象類,它支持讀寫本身到流。主要實現派生類FileStream
    • 若是文件的數據僅是文本,那麼你可使用StreamReader類和StreamWriter類來完成相應的讀和寫任務

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 }
View Code

例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         }
View Code

 

你寫了一個程序,其中要對硬盤上的一個文件操做,FileStream fs = new FileStream(fileName)
這樣就是創建了一個文件緩衝流,換句話的意思就是說你經過這條程序,計算機給了一塊內存空間,可是呢這塊內存
空間不是你想幹什麼就干涉麼的,他是專門存fileName這個文件裏面的內容的,內存空間的大小,和其餘信息,簡單地
操做時沒有辦法訪問的。當你要從文件裏面讀取一個Int整數的時候,程序作的不只僅是讀取一個int型整數,他會把該
數據附近的一大塊數據都讀出來放在剛纔的那塊空間中,爲何這麼作呢,由於CPU訪問硬盤比訪問內存慢多了,因此
一開始讀出不少的數據,後面須要使用的時候直接使用讀出來的,就防止了再次訪問硬盤。
相應的,你要網文件裏面寫入數據,也是先存到這個內存裏,等存的東西足夠多了,或者過了足夠的時間,系統一次性
把內容寫入硬盤。

TextReader類

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     }
View Code

TextWrite類

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     }
View Code

 StreamReader 類

    1. StreamReader類從TextReader抽象類繼承。
    2. 類TextReader表示一個讀者,它能夠讀取一系列字符。

下表描述了StreamReader類的通用方法:

 
方法 描述

Close

關閉StreamReader類的對象和相應的流,而且釋放與reader相關的任何系統資源

Peek 

返回下一個可用的字符但不消費它

Read 

從流中讀取下一個字符或下一個字符集

ReadLine

從當前流讀取一行字符,而且返回數據爲字符串

Seek 

容許在文件內移動讀/寫位置到任何地方

 

 

 

 

 

 

 

 

 

 

 

StreamWriter 類

    1. StreamWriter類繼承自TextWriter抽象類。
    2. TextWriter類表示一個writer,它能夠寫一系列字符

下表描述了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         }
View Code

 流的寫入用完後必定要記得Flush(清緩衝)同時若是不用流的話,把相應的流Close(關閉)!

Flush的做用就是強制執行了一次把數據寫出硬盤,這樣,你寫入的數據確實到了文件中,不然若是程序忽然中斷,你 要寫入的內容也許還沒寫到文件中,就形成了數據丟失。

相關文章
相關標籤/搜索