溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

如何使用C#讀取文件更有效率

發(fā)布時(shí)間:2021-11-03 13:47:42 來(lái)源:億速云 閱讀:350 作者:小新 欄目:編程語(yǔ)言

小編給大家分享一下如何使用C#讀取文件更有效率,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

通常我們用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、哇!開始讀了,調(diào)用一個(gè)文件流的一個(gè)方法讀取數(shù)據(jù)到data數(shù)組中

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

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

public static void SafeRead (Stream stream, byte[] data){      int offset=0;      int remaining = data.Length;         // 只要有剩余的字節(jié)就不停的讀      while (remaining > 0){          int read = stream.Read(data, offset, remaining);          if (read <= 0)              throw new EndOfStreamException("文件讀取到"+read.ToString()+"失?。?quot;);                // 減少剩余的字節(jié)數(shù)          remaining -= read;                // 增加偏移量          offset += read;      }  }

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

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

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

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

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

以上是“如何使用C#讀取文件更有效率”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI