欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

c#讀取文件詳談

 更新時間:2013年09月16日 15:48:46   作者:  
你平時是怎么讀取文件的?使用流讀取。是的沒錯,C#給我們提供了非常強大的類庫(又一次吹捧了.NET一番)

c#里面封裝了幾乎所有我們可以想到的和我們沒有想到的類,流是讀取文件的一般手段,那么你真的會用它讀取文件中的數(shù)據(jù)了么?真的能讀完全么?

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

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

復制代碼 代碼如下:

FileStream fs = File.OpenRead(filename);

或者
復制代碼 代碼如下:

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

2、準備一個存放文件內容的字節(jié)數(shù)組,fs.Length將得到文件的實際大小,就像下面這樣 byte[] data = new byte[fs.Length];

3、哇!開始讀了,調用一個文件流的一個方法讀取數(shù)據(jù)到data數(shù)組中 fs.Read (data, 0, data.Length);

呵呵!我們只寫了3句就可以把文件里面的內容原封不動的讀出來,真是太簡潔了!可以這段代碼真的能像你預期的那樣工作么?

答案是:幾乎可以!在大部分情況下上面的代碼工作的很好,但是我們應該注意Read方法是有返回值的,既然有返回值那么一定有其道理,如果按照上面的寫法完全可以是一個沒有返回值的函數(shù)。我想返回值的目的是,為了給我們一個機會判斷實際讀取文件的大小,從而來判斷文件是否已經完全讀完。所以上面的代碼不能保證我們一定讀完了文件里面的所有字節(jié)(雖然在很多情況下是讀完了)。下面的方法提供了一個比上面方法更安全的方法,來保證文件被完全讀出

復制代碼 代碼如下:

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()+"失?。?); // 減少剩余的字節(jié)數(shù) remaining -= read; // 增加偏移量 offset += read;

}

}


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

public static byte[] ReadFully (Stream stream)

{

// 初始化一個32k的緩存

byte[] buffer = new byte[32768];

using (MemoryStream ms = new MemoryStream()){

//返回結果后會自動回收調用該對象的Dispose方法釋放內存

// 不停的讀取 while (true){

int read = stream.Read (buffer, 0, buffer.Length); // 直到讀取完最后的

3M數(shù)據(jù)就可以返回結果了

if (read <= 0) return ms.ToArray();

ms.Write (buffer, 0, read); }

}}


雖然上面的例子都比較簡單,效果也不是很明顯(大部分都是對的),也許你早就會了,沒關系這篇文章本來就是寫給初學者的。下面的方法提供了一種使用指定緩存長度的方式讀取流,雖然在很多情況下你可以直接使用Stream.Length得到流的長度,但是不是所有的流都可以得到。
復制代碼 代碼如下:

public static byte[] Read2Buffer (Stream stream, int BufferLen)

{

// 如果指定的無效長度的緩沖區(qū),則指定一個默認的長度作為緩存大小

if (BufferLen < 1){ BufferLen = 0x8000; }

// 初始化一個緩存區(qū) byte[] buffer = new byte[BufferLen]; int read=0; int block;

// 每次從流中讀取緩存大小的數(shù)據(jù),知道讀取完所有的流為止

while ( (block = stream.Read(buffer, read, buffer.Length-read)) > 0)

{

// 重新設定讀取位置 read += block;

// 檢查是否到達了緩存的邊界,檢查是否還有可以讀取的信息

if (read == buffer.Length){

// 嘗試讀取一個字節(jié) int nextByte = stream.ReadByte();

// 讀取失敗則說明讀取完成可以返回結果 if (nextByte==-1){ return buffer; }

// 調整數(shù)組大小準備繼續(xù)讀取

byte[] newBuf = new byte[buffer.Length*2]; Array.Copy(buffer, newBuf, buffer.Length);

newBuf[read]=(byte)nextByte; buffer = newBuf;

// buffer是一個引用(指針),這里意在重新設定buffer指針指向一個更大的內存 read++; }

} // 如果緩存太大則使用ret來收縮前面while讀取的buffer,


然后直接返回
復制代碼 代碼如下:

byte[] ret = new byte[read];

Array.Copy(buffer, ret, read); return ret;}

相關文章

  • C# 如何調用python腳本

    C# 如何調用python腳本

    這篇文章主要介紹了C# 如何調用python腳本,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-09-09
  • VS2019打包WPF安裝程序最新教程(圖文詳解)

    VS2019打包WPF安裝程序最新教程(圖文詳解)

    這篇文章主要介紹了VS2019打包WPF安裝程序最新教程,本文圖文并茂給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-11-11
  • C# XML字符串包含特殊字符的處理轉換方法小結

    C# XML字符串包含特殊字符的處理轉換方法小結

    今天用C#輸出XML文件時,發(fā)現(xiàn)報錯,經過反復檢查調試,發(fā)現(xiàn)是因為某處內容含有某些特殊字符,這些特殊字符是在XML里不被允許的
    2020-07-07
  • C#之泛型詳解

    C#之泛型詳解

    本文詳細講解了C#中的泛型,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-04-04
  • C#中標準的IDispose模式代碼詳解

    C#中標準的IDispose模式代碼詳解

    在本篇文章中小編給大家分享的是關于C#中標準的IDispose模式的實例用法相關內容,有需要的朋友們測試下。
    2019-09-09
  • c#循環(huán)中產生偽隨機數(shù)

    c#循環(huán)中產生偽隨機數(shù)

    在循環(huán)中產生多個隨機數(shù),容易出現(xiàn)連續(xù)相同的數(shù)據(jù),最終的多個隨機數(shù)并不隨機,而是帶有某種規(guī)律性。
    2010-06-06
  • C#中調用Servlet示例

    C#中調用Servlet示例

    這篇文章主要介紹了C#中調用Servlet示例,本文實現(xiàn)通用消息接口使用servlet作為服務器端服務接口,第三方應用程序通過http post的方式調用servlet,實現(xiàn)與通用消息接口的調用連接,需要的朋友可以參考下
    2015-05-05
  • C#編寫游戲客戶端的實現(xiàn)代碼

    C#編寫游戲客戶端的實現(xiàn)代碼

    這篇文章主要介紹了C#編寫游戲客戶端的實現(xiàn)代碼,連接客戶端原理流程圖,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-11-11
  • C# 線性插值的實現(xiàn)示例

    C# 線性插值的實現(xiàn)示例

    線性插值是針對一維數(shù)據(jù)的插值方法,本文主要介紹了C# 線性插值的實現(xiàn)示例,具有一定的參考價值,感興趣的可以了解一下
    2024-03-03
  • winform異型不規(guī)則界面設計的實現(xiàn)方法

    winform異型不規(guī)則界面設計的實現(xiàn)方法

    這篇文章主要介紹了winform異型不規(guī)則界面設計的實現(xiàn)方法,具有不錯的實用價值,需要的朋友可以參考下
    2014-08-08

最新評論