最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

c#讀取文件詳談

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

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

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

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

復(fù)制代碼 代碼如下:

FileStream fs = File.OpenRead(filename);

或者
復(fù)制代碼 代碼如下:

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)保證文件被完全讀出

復(fù)制代碼 代碼如下:

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í)際的長(zhǎng)度比如:網(wǎng)絡(luò)流。此時(shí)可以使用類似的方法讀取流直到流里面的數(shù)據(jù)完全讀取出來(lái)為止。我們可以先初始化一段緩存,再將流讀出來(lái)的流信息寫(xiě)到內(nèi)存流里面,就像下面這樣:
復(fù)制代碼 代碼如下:

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)就是寫(xiě)給初學(xué)者的。下面的方法提供了一種使用指定緩存長(zhǎng)度的方式讀取流,雖然在很多情況下你可以直接使用Stream.Length得到流的長(zhǎng)度,但是不是所有的流都可以得到。
復(fù)制代碼 代碼如下:

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[] newBuf = 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,


然后直接返回
復(fù)制代碼 代碼如下:

byte[] ret = new byte[read];

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

相關(guān)文章

  • C#使用WebSocket實(shí)現(xiàn)聊天室功能

    C#使用WebSocket實(shí)現(xiàn)聊天室功能

    這篇文章主要為大家詳細(xì)介紹了C#使用WebSocket實(shí)現(xiàn)聊天室功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • C#定時(shí)器實(shí)現(xiàn)自動(dòng)執(zhí)行的方法

    C#定時(shí)器實(shí)現(xiàn)自動(dòng)執(zhí)行的方法

    這篇文章主要介紹了C#定時(shí)器實(shí)現(xiàn)自動(dòng)執(zhí)行的方法,實(shí)例分析了C#定時(shí)器參數(shù)的設(shè)置及方法的調(diào)用與實(shí)現(xiàn),需要的朋友可以參考下
    2015-01-01
  • C#使用CallContext緩存線程數(shù)據(jù)

    C#使用CallContext緩存線程數(shù)據(jù)

    這篇文章介紹了C#使用CallContext緩存線程數(shù)據(jù)的方法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-05-05
  • c# list部分操作實(shí)現(xiàn)代碼

    c# list部分操作實(shí)現(xiàn)代碼

    這篇文章主要介紹了c# list部分操作,需要的朋友可以參考下
    2013-09-09
  • C#中FormsAuthentication用法實(shí)例

    C#中FormsAuthentication用法實(shí)例

    這篇文章主要介紹了C#中FormsAuthentication用法實(shí)例,本文直接給出實(shí)現(xiàn)代碼,需要的朋友可以參考下
    2015-02-02
  • C#實(shí)現(xiàn)異步操作的幾種方式

    C#實(shí)現(xiàn)異步操作的幾種方式

    在C#中,異步操作可以提高程序的性能和響應(yīng)能力,本文主要介紹了C#實(shí)現(xiàn)異步操作的幾種方式,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-03-03
  • C#?Winform實(shí)現(xiàn)圓角無(wú)鋸齒按鈕

    C#?Winform實(shí)現(xiàn)圓角無(wú)鋸齒按鈕

    這篇文章主要介紹了C#?Winform實(shí)現(xiàn)圓角無(wú)鋸齒按鈕,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,感興趣的小伙伴可以參考一下
    2022-08-08
  • C#泛型接口的協(xié)變和逆變

    C#泛型接口的協(xié)變和逆變

    本文詳細(xì)講解了C#泛型接口的協(xié)變和逆變,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-04-04
  • 優(yōu)雅又實(shí)用的C#代碼優(yōu)化技巧分享

    優(yōu)雅又實(shí)用的C#代碼優(yōu)化技巧分享

    這篇文章主要為大家整理了一些優(yōu)雅又實(shí)用的C#代碼優(yōu)化技巧,文中的示例代碼講解詳細(xì),對(duì)我們深入了解C#有一定的幫助,需要的可以參考一下
    2023-06-06
  • C#使用System.Threading.Timer實(shí)現(xiàn)計(jì)時(shí)器的示例詳解

    C#使用System.Threading.Timer實(shí)現(xiàn)計(jì)時(shí)器的示例詳解

    以往一般都是用 System.Timers.Timer 來(lái)做計(jì)時(shí)器,其實(shí) System.Threading.Timer 也可以實(shí)現(xiàn)計(jì)時(shí)器功能,下面就跟隨小編一起來(lái)學(xué)習(xí)一下如何使用System.Threading.Timer實(shí)現(xiàn)計(jì)時(shí)器功能吧
    2024-01-01

最新評(píng)論

光山县| 平舆县| 建始县| 连江县| 东阳市| 碌曲县| 沙湾县| 浦北县| 武乡县| 蒲江县| 鸡泽县| 永兴县| 彰化县| 盖州市| 蕲春县| 佛坪县| 山东省| 金塔县| 如皋市| 景德镇市| 衡水市| 铜梁县| 延安市| 芮城县| 新巴尔虎右旗| 周口市| 建始县| 宝鸡市| 南郑县| 贡嘎县| 青海省| 平利县| 陕西省| 师宗县| 明溪县| 永定县| 江都市| 宝清县| 石景山区| 保亭| 建水县|