成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

C#實(shí)現(xiàn)讀寫文本文件的方法-創(chuàng)新互聯(lián)

理論上,可以使用FileStream類讀取和顯示文本文件。前面已經(jīng)介紹了這個(gè)類。上面顯示NewFile.txt文件的格式不太容易理解,但這并不是FileStream類的問(wèn)題——而在于我們?cè)谖谋究蛑酗@示結(jié)果所使用的方式。

站在用戶的角度思考問(wèn)題,與客戶深入溝通,找到孫吳網(wǎng)站設(shè)計(jì)與孫吳網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗(yàn),讓設(shè)計(jì)與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個(gè)性化、用戶體驗(yàn)好的作品,建站類型包括:成都做網(wǎng)站、成都網(wǎng)站設(shè)計(jì)、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣、域名注冊(cè)網(wǎng)站空間、企業(yè)郵箱。業(yè)務(wù)覆蓋孫吳地區(qū)。

如果知道某個(gè)文件包含文本,通常就可以使用StreamReader 和 StreamWriter類更方便地讀寫它們。這是因?yàn)檫@些類工作的級(jí)別比較高,特別適合于讀寫文本。它們執(zhí)行的方法可以根據(jù)流的內(nèi)容,自動(dòng)檢測(cè)出停止讀取文本較方便的位置,特別是:
●這些類執(zhí)行的方法可以一次讀寫一行文本(StreamReader.ReadLine() 和 StreamWriter.WriteLine())。在讀取文件時(shí),流會(huì)自動(dòng)確定下一個(gè)回車符的位置,并在該處停止讀取。在寫入文件時(shí),流會(huì)自動(dòng)把回車符和換行符添加到文本的末尾。
●使用StreamReader 和 StreamWriter類,就不需要擔(dān)心文件中使用的編碼方式(文本格式)了??赡艿木幋a方式是ASCII(一個(gè)字節(jié)表示一個(gè)字符)或者基于Unicode的格式,UNICODE、UTF7和 UTF8。Windows 9x系統(tǒng)上的文本文件總是ASCII格式,因?yàn)閃indows 9x系統(tǒng)不支持Unicode,但Windows NT、2000、XP和2003都支持Unicode,所以文本文件除了包含ASCII數(shù)據(jù)之外,理論上可以包含Unicode、UTF7或 UTF8數(shù)據(jù)。其約定是:如果文件是ASCII格式,就只包含文本。如果是Unicode格式,就用文件的前兩個(gè)或三個(gè)字節(jié)來(lái)表示,這幾個(gè)字節(jié)可以設(shè)置為表示文件中格式的值的特定組合。
這些字節(jié)稱為字節(jié)碼標(biāo)記。在使用標(biāo)準(zhǔn)Windows應(yīng)用程序打開(kāi)一個(gè)文件時(shí),例如Notepad 或 WordPad,不需要考慮這個(gè)問(wèn)題,因?yàn)檫@些應(yīng)用程序都支持不同的編碼方法,會(huì)自動(dòng)正確地讀取文件。StreamReader類也是這樣,它可以正確讀取任何格式的文件,而StreamWriter類可以使用任何一種編碼技術(shù)格式化它要寫入的文本。另一方面,如果要使用FileStream類讀取和顯示文本文件,就不必自己處理這個(gè)過(guò)程了。

  1. StreamReader類
    StreamReader用于讀取文本文件。用某些方式構(gòu)造一個(gè)StreamReader要比構(gòu)造一個(gè)FileStream實(shí)例更簡(jiǎn)單,因?yàn)槭褂肧treamReader時(shí)不需要FileStream的一些選項(xiàng)。特別是不需要模式和訪問(wèn)類型,因?yàn)镾treamReader只能執(zhí)行讀取操作。除此以外,沒(méi)有指定共享許可的直接選項(xiàng),但StreamReader有兩個(gè)新選項(xiàng):
    ●需要指定不同的編碼方法所執(zhí)行的不同操作。可以構(gòu)造一個(gè)StreamReader 檢查文件開(kāi)頭的字節(jié)碼標(biāo)記,確定編碼方法,或者告訴StreamReader該文件使用某個(gè)編碼方法。
    ●不提供要讀取的文件名,而為另一個(gè)流提供引用。
    最后一個(gè)選項(xiàng)需要解釋一下,因?yàn)樗婕暗桨炎x寫數(shù)據(jù)的模型建立在流概念上的另一個(gè)優(yōu)點(diǎn)。StreamReader工作在相對(duì)比較高的級(jí)別上,如果有另一個(gè)流在讀取其他源的數(shù)據(jù),就要使用由StreamReader提供的工具來(lái)處理這個(gè)流,因?yàn)檫@個(gè)流包含文本,此時(shí)StreamReader就非常有用了??梢园堰@個(gè)流的輸出傳送到StreamReader上,這樣,StreamReader就可以讀取和處理任何數(shù)據(jù)源(不僅僅是文件)中的數(shù)據(jù)了。前面在討論BinaryReader類時(shí)也討論了這種情況。但在本書中,只使用StreamReader來(lái)直接連接文件。
    其結(jié)果是StreamReader有非常多的構(gòu)造函數(shù)。而且,還有兩個(gè)返回StreamReader引用的FileInfo方法:OpenText() 和 CreateText()。下面僅說(shuō)明其中一些構(gòu)造函數(shù)。
    最簡(jiǎn)單的構(gòu)造函數(shù)只帶一個(gè)文件名參數(shù)。StreamReader會(huì)檢查字節(jié)碼標(biāo)記,確定編碼方法:
    StreamReader sr = new StreamReader(@"C:"My Documents"ReadMe.txt");
    另外,如果指定UTF8編碼方法:
    StreamReader sr = new StreamReader(@"C:"My Documents"ReadMe.txt",
    Encoding.UTF8);
    使用類System.Text.Encoding上的幾個(gè)屬性之一,就可以指定編碼方法。這個(gè)類是一個(gè)抽象基類,可以根據(jù)這個(gè)類定義許多類,其方法可執(zhí)行實(shí)際的文本編碼。每個(gè)屬性都返回相應(yīng)類的一個(gè)實(shí)例,可以使用的屬性包括:
    ●ASCII
    ●Unicode
    ●UTF7
    ●UTF8
    ●BigEndianUnicode
    下面的示例解釋了如何把StreamReader關(guān)聯(lián)到FileStream上。其優(yōu)點(diǎn)是可以顯式指定是否創(chuàng)建文件和共享許可,如果直接把StreamReader關(guān)聯(lián)到文件上,就不能這么做:
    FileStream fs = new FileStream(@"C:"My Documents"ReadMe.txt",
    FileMode.Open, FileAccess.Read, FileShare.None);
    StreamReader sr = new StreamReader(fs);
    對(duì)于本例,指定StreamReader查找字節(jié)碼標(biāo)記,以確定使用了什么編碼方法,以后的示例也是這樣,從一個(gè)FileInfo實(shí)例中獲得StreamReader:
    FileInfo myFile = new FileInfo(@"C:"My Documents"ReadMe.txt");
    StreamReader sr = myFile.OpenText();
    與FileStream一樣,應(yīng)在使用后關(guān)閉StreamReader。如果沒(méi)有這樣做,就會(huì)致使文件一直鎖定,因此不能執(zhí)行其他過(guò)程(除非使用FileStream構(gòu)造StreamReader和特定的FileShare. ShareReadWrite):
    sr.Close();
    介紹完實(shí)例化StreamReader后,就可以用該實(shí)例作一些工作了。與FileStream一樣,我們僅指出可以用于讀取數(shù)據(jù)的許多方式,您應(yīng)在SDK文檔說(shuō)明書中查閱其他不太常用的StreamReader方法。
    所使用的最簡(jiǎn)單的方式是ReadLine(),該方法一次讀取一行,但返回的字符串中不包括標(biāo)記該行結(jié)束的回車換行符:
    string nextLine = sr.ReadLine();
    另外,還可以在一個(gè)字符串中提取文件的所有剩余內(nèi)容(嚴(yán)格地說(shuō),是流的全部剩余內(nèi)容):
    string restOfStream = sr.ReadToEnd();
    可以只讀取一個(gè)字符:
    int nextChar = sr.Read();
    Read()的重載方法可以把返回的字符轉(zhuǎn)換為一個(gè)整數(shù),如果到達(dá)流的尾端,就返回-1。
    最后,可以用一個(gè)偏移值,把給定個(gè)數(shù)的字符讀到數(shù)組中:
    // to read 100 characters in.
    int nChars = 100;
    char [] charArray = new char[nChars];
    int nCharsRead = sr.Read(charArray, 0, nChars);
    如果要求讀取的字符數(shù)多于文件中剩余的字符數(shù),nCharsRead應(yīng)小于nChars 。
  2. StreamWriter類
    StreamWriter類的工作方式與StreamReader的類似,但StreamWriter只能用于寫入文件(或另一個(gè)流)。構(gòu)造StreamWriter的方法包括:
    StreamWriter sw = new StreamWriter(@"C:"My Documents"ReadMe.txt");
    上面的代碼使用了UTF8編碼方法,.NET把這種編碼方法設(shè)置為默認(rèn)的編碼方法。如果要指定其他的編碼方法:
    StreamWriter sw = new StreamWriter(@"C:"My Documents"ReadMe.txt", true,
    Encoding.ASCII);
    在這個(gè)構(gòu)造函數(shù)中,第二個(gè)參數(shù)是Boolean型,表示文件是否應(yīng)以追加方式打開(kāi)。構(gòu)造函數(shù)的參數(shù)不能僅是一個(gè)文件名和一個(gè)編碼類。
    當(dāng)然,可以把StreamWriter關(guān)聯(lián)到一個(gè)文件流上,以獲得打開(kāi)文件的更多控制選項(xiàng):
    FileStream fs = new FileStream(@"C:"My Documents"ReadMe.txt",
    FileMode.CreateNew, FileAccess.Write, FileShare.Read);
    StreamWriter sw = new StreamWriter(fs);
    FileInfo不執(zhí)行返回StreamWriter的任何方法。
    另外,如果要?jiǎng)?chuàng)建一個(gè)新文件,并開(kāi)始給它寫入數(shù)據(jù),可以使用下面的代碼:
    FileInfo myFile = new FileInfo(@"C:"My Documents"NewFile.txt");
    StreamWriter sw = myFile.CreateText();
    與其他流類一樣,在使用完后,要關(guān)閉StreamWriter:
    sw.Close();
    寫入流可以使用StreamWriter.Write()的4個(gè)重載方法來(lái)完成。最簡(jiǎn)單的方式是寫入一個(gè)流,后面加上一個(gè)回車換行符:
    string nextLine = "Groovy Line";
    sw.Write(nextLine);
    也可以寫入一個(gè)字符:
    char nextChar = ~a~;
    sw.Write(nextChar);
    也可以寫入一個(gè)字符數(shù)組:
    char [] charArray = new char[100];
    // initialize these characters
    sw.Write(charArray);
    甚至可以寫入字符數(shù)組的一部分:
    int nCharsToWrite = 50;
    int startAtLocation = 25;
    char [] charArray = new char[100];
    // initialize these characters
    sw.Write(charArray, startAtLocation, nCharsToWrite);
    3.ReadWriteText示例
    ReadWriteText示例說(shuō)明了StreamReader和StreamWriter類的用法。它非常類似于前面的ReadBinaryFile示例,但假定要讀取的文件是一個(gè)文本文件,并顯示其內(nèi)容。它還可以保存文件(包括在文本框中對(duì)文本進(jìn)行的修改)。它將以Unicode格式保存文件。
    圖30-9所示的ReadWriteText用于顯示前面的NewFile.aspx文件。但這次讀取內(nèi)容會(huì)更容易一些。
    這里不打算介紹給打開(kāi)文件對(duì)話框添加事件處理程序的詳細(xì)內(nèi)容,因?yàn)樗鼈兓旧吓c前面的BinaryFileReader示例相同。與這個(gè)示例相同,打開(kāi)一個(gè)新文件,將調(diào)用DisplayFile()方法。其惟一的區(qū)別是DisplayFile的執(zhí)行方式,本例有一個(gè)保存文件的選項(xiàng)。這由另一個(gè)菜單項(xiàng)save來(lái)表示,這個(gè)選項(xiàng)的處理程序調(diào)用我們添加到代碼中的另一個(gè)方法SaveFile()(注意,這個(gè)新文件總是重寫原來(lái)的文件——這個(gè)示例沒(méi)有寫入另一個(gè)文件的選項(xiàng))。

圖  30-9
首先看看SaveFile(),因?yàn)樗亲詈?jiǎn)單的一個(gè)函數(shù)。首先利用StreamReader.WriteLine()方法把文本框中的每行文本依次寫入StreamWriter流,并在每行文本的最后加上回車換行符:
void SaveFile()
{
StreamWriter sw = new StreamWriter(chosenFile, false,
Encoding.Unicode);
foreach (string line in textBoxContents.Lines)
sw.WriteLine(line);
sw.Close();
}
chosenFile是主窗體的一個(gè)字符串字段,它包含已經(jīng)讀取的文件的名稱(與前面的示例一樣)。注意在打開(kāi)流時(shí)指定Unicode編碼方式。如果要以其他格式寫入文件,則只需要改變?cè)搮?shù)的值。如果要把文本追加到文件中,這個(gè)構(gòu)造函數(shù)的第二個(gè)參數(shù)就設(shè)置為true,但本例不是這樣。在構(gòu)造時(shí)必須為StreamWriter設(shè)置編碼方式,可以使用只讀屬性Encoding。
下面介紹文件的讀取方式。讀取過(guò)程比較復(fù)雜,因?yàn)槲覀儾恢酪x取的文件中包含多少行文本(換言之,文件中包含多少個(gè)(char)13 – (char)10序列,因?yàn)閏har(13) –char(10)是行末的回車換行符)。解決這個(gè)問(wèn)題的方式是,先把文件讀入一個(gè)StringCollection類的實(shí)例,該類在System.Collections.Specialized命名空間中,主要用于保存可動(dòng)態(tài)擴(kuò)展的一組字符串。它的兩個(gè)方法是我們感興趣的:把字符串添加到集合中的Add()和把字符串集合復(fù)制到一個(gè)數(shù)組(一個(gè)System.Array實(shí)例)中的CopyTo()。StringCollection對(duì)象的每個(gè)元素包含文件中的一行文本。
DisplayFile()方法調(diào)用另一個(gè)方法ReadFileIntoStringCollection(),來(lái)讀取文件。之后,就知道文件中有多少行文本了。把StringCollection復(fù)制到大小固定的數(shù)組中,并把數(shù)組中的內(nèi)容填充到文本框中。在進(jìn)行復(fù)制時(shí),只復(fù)制了字符串的引用,沒(méi)有復(fù)制字符串本身,所以該過(guò)程的執(zhí)行效率很高:
void DisplayFile()
{
StringCollection linesCollection = ReadFileIntoStringCollection();
string [] linesArray = new string[linesCollection.Count];
linesCollection.CopyTo(linesArray, 0);
this.textBoxContents.Lines = linesArray;
}
StringCollection.CopyTo()的第二個(gè)參數(shù)表示目標(biāo)數(shù)組中的下標(biāo),我們從該下標(biāo)指定的位置開(kāi)始復(fù)制集合。
下面看看ReadFileIntoStringCollection()方法。使用StreamReader讀取每一行文本。編譯時(shí)需要計(jì)算讀取的字符數(shù),以確保不超出文本框的范圍:
StringCollection ReadFileIntoStringCollection()
{
const int MaxBytes = 65536;
StreamReader sr = new StreamReader(chosenFile);
StringCollection result = new StringCollection();
int nBytesRead = 0;
string nextLine;
while ( (nextLine = sr.ReadLine()) != null)
{
nBytesRead += nextLine.Length;
if (nBytesRead > MaxBytes)
break;
result.Add(nextLine);
}
sr.Close();
return result;
}
這就是該示例的完整代碼。
如果運(yùn)行ReadWriteText,讀取NewFile.aspx文件,然后保存它,該文件的格式就是Unicode。任何常用的Windows應(yīng)用程序(Notepand,Wordpad)都沒(méi)有提供這種格式,甚至ReadWriteText示例也只能在Windows NT/2000/XP/2003下正確讀取和顯示文件。因?yàn)閃indows 9x不支持Unicode,像Notepad這樣的應(yīng)用程序不能識(shí)別其他平臺(tái)上的Unicode文件(如果從Wrox Press網(wǎng)站上下載了這個(gè)示例,就可以試試)。但是,如果使用前面的ReadBinaryFile示例顯示文件,就會(huì)立即看出它們的區(qū)別,如圖30-10所示。最前面的兩個(gè)字節(jié)表示文件的格式是Unicode,之后,每個(gè)字符都用兩個(gè)字節(jié)來(lái)表示。這是非常明顯的,因?yàn)樵谶@個(gè)文件中,每個(gè)字符的高位字節(jié)都是0,所以每隔一個(gè)字節(jié)就顯示x00。

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。

當(dāng)前文章:C#實(shí)現(xiàn)讀寫文本文件的方法-創(chuàng)新互聯(lián)
瀏覽地址:http://jinyejixie.com/article42/gpgec.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站導(dǎo)航、營(yíng)銷型網(wǎng)站建設(shè)商城網(wǎng)站、網(wǎng)站設(shè)計(jì)面包屑導(dǎo)航、做網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

h5響應(yīng)式網(wǎng)站建設(shè)
澄迈县| 长丰县| 东辽县| 固阳县| 郧西县| 会同县| 雷山县| 博罗县| 资溪县| 固阳县| 青铜峡市| 怀来县| 江源县| 邢台市| 上思县| 灯塔市| 儋州市| 肥乡县| 濮阳市| 锡林郭勒盟| 突泉县| 鄢陵县| 广河县| 双城市| 丘北县| 略阳县| 巴楚县| 平遥县| 安国市| 康平县| 上杭县| 商河县| 安义县| 义乌市| 兰考县| 巴南区| 灌南县| 土默特左旗| 乡宁县| 乌拉特中旗| 梧州市|