av激情亚洲男人的天堂国语,日韩欧美精品一中文字幕,无码av一区二区三区无码,国产又色又爽又刺激的a片,国产又色又爽又刺激的a片

使用C#讀取文件更有效率的幾種方法

C#給我們提供了很強(qiáng)大的功能,包括如何讀取文件。讀取文件也是日常開(kāi)發(fā)中,實(shí)現(xiàn)功能操作的重要步驟,希望本文能給大家了解C#讀取文件有更深刻的了解。編輯推薦《C#實(shí)用基礎(chǔ)教程》。

成都創(chuàng)新互聯(lián)公司堅(jiān)持“要么做到,要么別承諾”的工作理念,服務(wù)領(lǐng)域包括:成都網(wǎng)站制作、成都網(wǎng)站設(shè)計(jì)、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣等服務(wù),滿足客戶于互聯(lián)網(wǎng)時(shí)代的鄂倫春網(wǎng)站設(shè)計(jì)、移動(dòng)媒體設(shè)計(jì)的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡(luò)建設(shè)合作伙伴!

通常我們用C#讀取文件一個(gè)文件使用如下的步驟:

1、聲明并使用File的OpenRead實(shí)例化一個(gè)文件流對(duì)象,就像下面這樣

FileStream fs = File.OpenRead(filename);

或者

FileStream fs = FileStream(filename, FileMode.Open, FileAccess.Read, FileShare.Read);

2、準(zhǔn)備一個(gè)存放文件內(nèi)容的字節(jié)數(shù)組,fs.Length將得到文件的實(shí)際大小,就像下面這樣

byte[] data = new byte[fs.Length];

3、哇!開(kāi)始讀了,調(diào)用一個(gè)文件流的一個(gè)方法讀取數(shù)據(jù)到data數(shù)組中

 fs.Read (data, 0, data.Length);

我們只寫(xiě)了3句就可以把文件里面的內(nèi)容原封不動(dòng)的讀出來(lái),真是太簡(jiǎn)潔了!可以這段代碼真的能像你預(yù)期的那樣工作么?答案是:幾乎可以!在大部分情況下上面的代碼工作的很好,但是我們應(yīng)該注意Read方法是有返回值的,既然有返回值那么一定有其道理,如果按照上面的寫(xiě)法完全可以是一個(gè)沒(méi)有返回值的函數(shù)。我想返回值的目的是,為了給我們一個(gè)機(jī)會(huì)判斷實(shí)際讀取文件的大小,從而來(lái)判斷文件是否已經(jīng)完全讀完。所以上面的代碼不能保證我們一定讀完了文件里面的所有字節(jié)(雖然在很多情況下是讀完了)。下面的方法提供了一個(gè)比上面方法更安全的方法,來(lái)保證文件被完全讀出

 
 
 
  1. public static void SafeRead (Stream stream, byte[] data){  
  2.     int offset=0;  
  3.     int remaining = data.Length;  
  4.        // 只要有剩余的字節(jié)就不停的讀  
  5.     while (remaining > 0){  
  6.         int read = stream.Read(data, offset, remaining);  
  7.         if (read <= 0)  
  8.             throw new EndOfStreamException("文件讀取到"+read.ToString()+"失敗!");  
  9.               // 減少剩余的字節(jié)數(shù)  
  10.         remaining -= read;  
  11.               // 增加偏移量  
  12.         offset += read;  
  13.     }  

有些情況下你不知道流實(shí)際的長(zhǎng)度比如:網(wǎng)絡(luò)流。此時(shí)可以使用類似的方法讀取流直到流里面的數(shù)據(jù)完全讀取出來(lái)為止。我們可以先初始化一段緩存,再將流讀出來(lái)的流信息寫(xiě)到內(nèi)存流里面,就像下面這樣:

 
 
 
  1. public static byte[] ReadFully (Stream stream){  
  2.        // 初始化一個(gè)32k的緩存  
  3.     byte[] buffer = new byte[32768];  
  4.     using (MemoryStream ms = new MemoryStream()){ //返回結(jié)果后會(huì)自動(dòng)回收調(diào)用該對(duì)象的Dispose方法釋放內(nèi)存  
  5.               // 不停的讀取  
  6.         while (true){  
  7.             int read = stream.Read (buffer, 0, buffer.Length);  
  8.                      // 直到讀取完***的3M數(shù)據(jù)就可以返回結(jié)果了  
  9.             if (read <= 0)  
  10.                 return ms.ToArray();  
  11.             ms.Write (buffer, 0, read);  
  12.         }  
  13.     }  

雖然上面的例子都比較簡(jiǎn)單,效果也不是很明顯(大部分都是對(duì)的),也許你早就會(huì)了,沒(méi)關(guān)系這篇文章本來(lái)就是寫(xiě)給初學(xué)者的。

下面的方法提供了一種使用指定緩存長(zhǎng)度的方式讀取流,雖然在很多情況下你可以直接使用Stream.Length得到流的長(zhǎng)度,但是不是所有的流都可以得到。

 
 
 
  1. public static byte[] Read2Buffer (Stream stream, int BufferLen){  
  2.        // 如果指定的無(wú)效長(zhǎng)度的緩沖區(qū),則指定一個(gè)默認(rèn)的長(zhǎng)度作為緩存大小  
  3.        if (BufferLen < 1){  
  4.               BufferLen = 0x8000;  
  5.        }  
  6.        // 初始化一個(gè)緩存區(qū)  
  7.        byte[] buffer = new byte[BufferLen];  
  8.        int read=0;     
  9.        int block;  
  10.        // 每次從流中讀取緩存大小的數(shù)據(jù),知道讀取完所有的流為止  
  11.        while ( (block = stream.Read(buffer, read, buffer.Length-read)) > 0){  
  12.               // 重新設(shè)定讀取位置  
  13.               read += block;  
  14.                // 檢查是否到達(dá)了緩存的邊界,檢查是否還有可以讀取的信息  
  15.               if (read == buffer.Length){  
  16.                      // 嘗試讀取一個(gè)字節(jié)  
  17.                      int nextByte = stream.ReadByte();        
  18.                      // 讀取失敗則說(shuō)明讀取完成可以返回結(jié)果  
  19.                      if (nextByte==-1){  
  20.                             return buffer;  
  21.                      }  
  22.                      // 調(diào)整數(shù)組大小準(zhǔn)備繼續(xù)讀取  
  23.                      byte[] newnewBuf = new byte[buffer.Length*2];  
  24.                      Array.Copy(buffer, newBuf, buffer.Length);  
  25.                      newBuf[read]=(byte)nextByte;  
  26.                      buffer = newBuf;// buffer是一個(gè)引用(指針),這里意在重新設(shè)定buffer指針指向一個(gè)更大的內(nèi)存  
  27.                      read++;  
  28.               }  
  29.        }  
  30.        // 如果緩存太大則使用ret來(lái)收縮前面while讀取的buffer,然后直接返回  
  31.        byte[] ret = new byte[read];  
  32.        Array.Copy(buffer, ret, read);  
  33.        return ret;  

如何更有效的使用C#讀取文件就介紹到這里。

【編輯推薦】

  1. C# GreetPeople方法
  2. C# Hashtable對(duì)象分析
  3. 常用C# Arraylist的介紹
  4. C# Observer設(shè)計(jì)模式
  5. C#交錯(cuò)數(shù)組淺析

當(dāng)前名稱:使用C#讀取文件更有效率的幾種方法
標(biāo)題路徑:http://uogjgqi.cn/article/cdihhce.html
掃二維碼與項(xiàng)目經(jīng)理溝通

我們?cè)谖⑿派?4小時(shí)期待你的聲音

解答本文疑問(wèn)/技術(shù)咨詢/運(yùn)營(yíng)咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流