成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

C#讀取文件高效方法淺析

開發(fā) 后端
C#讀取文件高效方法主要想你介紹了C#給我們提供了非常強(qiáng)大的類庫,里面封裝了幾乎所有我們可以想到的和我們沒有想到的類,希望對你有所幫助。

C#讀取文件高效方法問題的提出:你平時是怎么讀取文件的?使用流讀取。是的沒錯,C#給我們提供了非常強(qiáng)大的類庫(又一次吹捧了.NET一番),里面封裝了幾乎所有我們可以想到的和我們沒有想到的類,流是讀取文件的一般手段,那么你真的會用它讀取文件中的數(shù)據(jù)了么?真的能讀完全么?

通常我們使用C#讀取文件使用如下的步驟:

1、聲明并使用File的OpenRead實例化一個文件流對象,就像下面這樣

  1. FileStream fs = File.OpenRead(filename); 

或者

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

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

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

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

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

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

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

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

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

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

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

  1. public static byte[] Read2Buffer (Stream stream, int BufferLen){  
  2.  
  3. // 如果指定的無效長度的緩沖區(qū),則指定一個默認(rèn)的長度作為緩存大小  
  4.  
  5. if (BufferLen < 1){  
  6.  
  7. BufferLen = 0x8000;  
  8.  
  9. }  
  10.  
  11. // 初始化一個緩存區(qū)  
  12.  
  13. byte[] buffer = new byte[BufferLen];  
  14.  
  15. int read=0;     
  16.  
  17. int block;  
  18.  
  19. // 每次從流中讀取緩存大小的數(shù)據(jù),知道讀取完所有的流為止  
  20.  
  21. while ( (block = stream.Read(buffer, read, buffer.Length-read)) > 0){  
  22.  
  23. // C#讀取文件之重新設(shè)定讀取位置  
  24.  
  25. read += block;  
  26.  
  27.     
  28.  
  29. // C#讀取文件之檢查是否到達(dá)了緩存的邊界,檢查是否還有可以讀取的信息  
  30.  
  31. if (read == buffer.Length){  
  32.  
  33. // 嘗試讀取一個字節(jié)  
  34.  
  35. int nextByte = stream.ReadByte();  
  36.  
  37.      
  38.  
  39. // C#讀取文件之讀取失敗則說明讀取完成可以返回結(jié)果  
  40.  
  41. if (nextByte==-1){  
  42.  
  43. return buffer;  
  44.  
  45. }  
  46.  
  47.      
  48.  
  49. // 調(diào)整數(shù)組大小準(zhǔn)備繼續(xù)讀取  
  50.  
  51. byte[] newBuf = new byte[buffer.Length*2];  
  52.  
  53. Array.Copy(buffer, newBuf, buffer.Length);  
  54.  
  55. newBuf[read]=(byte)nextByte;  
  56.  
  57. buffer = newBuf;  
  58. // buffer是一個引用(指針),  
  59. //這里意在重新設(shè)定buffer指針指向一個更大的內(nèi)存  
  60.  
  61. read++;  
  62.  
  63. }  
  64.  
  65. }  
  66.  
  67. // 如果緩存太大則使用ret來收縮前面while讀取的buffer,然后直接返回  
  68.  
  69. byte[] ret = new byte[read];  
  70.  
  71. Array.Copy(buffer, ret, read);  
  72.  
  73. return ret;  
  74.  

C#讀取文件高效方法就向你介紹到這里,希望對你了解C#讀取文件有所幫助。

【編輯推薦】

  1. C#讀取XML節(jié)點內(nèi)容方法實例簡析
  2. C#讀取XML文檔使用XMLTextReader類淺析
  3. C#讀取文件夾中的文件操作淺析
  4. C#讀取文件夾下面的全部文件的實現(xiàn)
  5. C#讀取文件內(nèi)容另存的實現(xiàn)
責(zé)任編輯:仲衡 來源: 百度空間
相關(guān)推薦

2009-08-13 09:16:57

C#讀取配置文件

2009-09-02 19:08:03

C#實現(xiàn)讀取文本文件

2009-08-12 18:06:53

C#讀取二進(jìn)制文件

2009-09-10 14:52:55

C# get

2009-08-10 17:36:17

C#擴(kuò)展方法

2009-08-20 16:15:19

C# 匿名方法

2009-09-11 09:15:06

C# get方法

2009-08-12 16:57:28

C#讀取文件夾

2009-08-12 15:26:38

C#讀取XML文檔

2009-08-28 17:34:14

讀取word文檔

2009-09-10 09:10:17

C# TextBox換

2009-08-17 17:56:32

C# 枚舉

2009-08-12 16:26:30

C#讀取XML文檔

2009-08-18 16:42:49

C# 操作XML

2009-08-19 15:55:42

C#操作Access

2009-08-28 12:19:19

C#靜態(tài)方法

2009-08-28 15:52:23

C#利用sharpzi

2009-09-18 10:58:31

C#數(shù)組操作

2009-09-07 09:36:29

C# DisposeDispose方法

2009-08-20 10:53:23

C#操作內(nèi)存
點贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 久久成人人人人精品欧 | 国产一区二区三区精品久久久 | av中文在线观看 | 亚洲视频一区在线观看 | 在线观看国产视频 | 亚洲精品乱码久久久久久蜜桃91 | 99精品国自产在线 | 国产视频精品区 | 国产精品二区三区在线观看 | 超碰在线久| 91久久精品国产91久久 | 精品美女久久久久久免费 | 国产欧美在线观看 | 精品在线一区二区三区 | 精品成人一区二区 | 中文字幕精品一区二区三区精品 | 国产免费一区二区三区免费视频 | 日本免费一区二区三区四区 | 精品国产乱码久久久久久丨区2区 | 爱草在线 | 精品国产乱码久久久久久蜜退臀 | 亚洲精品一区国产精品 | www.亚洲视频| 中国一级特黄真人毛片 | 国产午夜视频 | 久久精品天堂 | 国产精品久久久久久久久久久久久 | 亚洲天堂影院 | 久久精品亚洲 | 日韩视频观看 | 欧美精品一区二区三区在线播放 | 午夜a级理论片915影院 | 日韩欧美精品一区 | 国产精品一区二区在线免费观看 | 欧美黄在线观看 | 天天精品在线 | 日本成人在线播放 | 欧美日本一区二区 | 日本午夜网| 中文字幕在线观看日韩 | 亚洲视频一区二区三区四区 |