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

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

開發 后端
C#讀取文件一般靠聲明并使用File的OpenRead實例化來實現,那如何更有效的實現C#讀取文件,則是本文介紹的內容。

C#給我們提供了很強大的功能,包括如何讀取文件。讀取文件也是日常開發中,實現功能操作的重要步驟,希望本文能給大家了解C#讀取文件有更深刻的了解。51CTO編輯推薦《C#實用基礎教程》。

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

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

FileStream fs = File.OpenRead(filename);

或者

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

2、準備一個存放文件內容的字節數組,fs.Length將得到文件的實際大小,就像下面這樣

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

3、哇!開始讀了,調用一個文件流的一個方法讀取數據到data數組中

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

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

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

有些情況下你不知道流實際的長度比如:網絡流。此時可以使用類似的方法讀取流直到流里面的數據完全讀取出來為止。我們可以先初始化一段緩存,再將流讀出來的流信息寫到內存流里面,就像下面這樣:

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

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

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

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

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

【編輯推薦】

  1. C# GreetPeople方法
  2. C# Hashtable對象分析
  3. 常用C# Arraylist的介紹
  4. C# Observer設計模式
  5. C#交錯數組淺析
責任編輯:彭凡 來源: yongfa365.com
相關推薦

2016-04-28 16:17:44

又拍云/CDN

2013-02-22 09:54:15

C#Excel讀取Excel

2020-12-09 22:00:38

GitLinux版本控制系統

2021-07-12 14:50:25

Linux命令文件

2009-09-01 18:35:53

C#判斷文件存在

2009-08-31 09:19:31

c#隱藏窗口

2011-05-04 16:56:45

激光一體機使用技巧

2021-01-27 13:28:55

編程語言Python

2020-12-22 10:46:42

Windows10操作系統應用

2009-08-03 11:37:36

C#日期時間控件

2009-09-24 14:59:38

C#編寫COM組件

2009-11-23 20:36:35

ibmdwRational

2015-08-19 13:40:58

編程編程更有效

2017-05-10 09:53:55

奧菲 傳媒

2010-11-24 13:31:20

MYSQL表聯結

2009-08-12 17:27:11

C#讀取文件

2010-07-01 14:59:51

FreeBSD 8

2017-10-16 13:23:18

手機信息iphone

2010-01-22 14:46:25

C++語言

2009-08-17 08:29:00

c#刪除指定文件
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧美区在线 | 国产精品观看 | 国产99热| 午夜视频网站 | www日本高清视频 | 国产福利资源在线 | 久久精品久久精品 | 丁香六月伊人 | 欧美日韩成人一区二区 | 亚洲免费观看视频 | 日韩精品一区二区三区 | 欧美日韩综合 | 五月免费视频 | 国产黄a一级 | 久久一区二区三区电影 | 99精品视频免费在线观看 | 最新中文字幕在线播放 | 欧美国产一区二区 | 91精品久久| 国产一区高清 | 青草视频在线 | 日韩精品一区二区三区中文字幕 | 欧美一级全黄 | 欧美视频一级 | 在线中文字幕视频 | 日韩国产精品一区二区三区 | 欧美亚洲国产一区二区三区 | 国产精品欧美一区二区 | 国产在线高清 | 欧美激情精品久久久久久变态 | 日韩一区二区在线视频 | 台湾佬成人网 | 日韩精品一区在线观看 | 亚洲日本视频 | 亚洲综合无码一区二区 | 91免费电影 | 亚洲精品久久久久中文字幕欢迎你 | 国产中文在线观看 | av久久| 日韩伦理一区二区 | 国产日韩欧美激情 |