国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發(fā) > 綜合 > 正文

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

2024-07-21 02:17:59
字體:
供稿:網(wǎng)友
注冊會(huì)員,創(chuàng)建你的web開發(fā)資料庫,你平時(shí)是怎么讀取文件的?使用流讀取。是的沒錯(cuò),c#給我們提供了非常強(qiáng)大的類庫(又一次吹捧了.net一番),里面封裝了幾乎所有我們可以想到的和我們沒有想到的類,流是讀取文件的一般手段,那么你真的會(huì)用它讀取文件中的數(shù)據(jù)了么?真的能讀完全么?

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

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í)際的長度比如:網(wǎng)絡(luò)流。此時(shí)可以使用類似的方法讀取流直到流里面的數(shù)據(jù)完全讀取出來為止。我們可以先初始化一段緩存,再將流讀出來的流信息寫到內(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);

}

}

}



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

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

public static byte[] read2buffer (stream stream, int bufferlen){

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

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();



// 讀取失敗則說明讀取完成可以返回結(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來收縮前面while讀取的buffer,然后直接返回

byte[] ret = new byte[read];

array.copy(buffer, ret, read);

return ret;

}


發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 淅川县| 兴义市| 新平| 陈巴尔虎旗| 封开县| 吉木乃县| 康马县| 民县| 明光市| 应用必备| 耿马| 酉阳| 大邑县| 邛崃市| 叶城县| 永清县| 汽车| 通海县| 麻阳| 刚察县| 淅川县| 随州市| 安义县| 青河县| 永川市| 周口市| 金湖县| 莎车县| 和静县| 珲春市| 偏关县| 江阴市| 荣昌县| 孟连| 陵水| 武隆县| 金乡县| 汝南县| 时尚| 万州区| 孟州市|