91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C#實現讀寫文本文件的方法

發布時間:2020-05-25 21:24:57 來源:億速云 閱讀:224 作者:鴿子 欄目:編程語言

理論上,可以使用FileStream類讀取和顯示文本文件。前面已經介紹了這個類。上面顯示NewFile.txt文件的格式不太容易理解,但這并不是FileStream類的問題——而在于我們在文本框中顯示結果所使用的方式。

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

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

圖  30-9
首先看看SaveFile(),因為它是最簡單的一個函數。首先利用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是主窗體的一個字符串字段,它包含已經讀取的文件的名稱(與前面的示例一樣)。注意在打開流時指定Unicode編碼方式。如果要以其他格式寫入文件,則只需要改變該參數的值。如果要把文本追加到文件中,這個構造函數的第二個參數就設置為true,但本例不是這樣。在構造時必須為StreamWriter設置編碼方式,可以使用只讀屬性Encoding。
下面介紹文件的讀取方式。讀取過程比較復雜,因為我們不知道要讀取的文件中包含多少行文本(換言之,文件中包含多少個(char)13 – (char)10序列,因為char(13) –char(10)是行末的回車換行符)。解決這個問題的方式是,先把文件讀入一個StringCollection類的實例,該類在System.Collections.Specialized命名空間中,主要用于保存可動態擴展的一組字符串。它的兩個方法是我們感興趣的:把字符串添加到集合中的Add()和把字符串集合復制到一個數組(一個System.Array實例)中的CopyTo()。StringCollection對象的每個元素包含文件中的一行文本。
DisplayFile()方法調用另一個方法ReadFileIntoStringCollection(),來讀取文件。之后,就知道文件中有多少行文本了。把StringCollection復制到大小固定的數組中,并把數組中的內容填充到文本框中。在進行復制時,只復制了字符串的引用,沒有復制字符串本身,所以該過程的執行效率很高:
void DisplayFile()
{
StringCollection linesCollection = ReadFileIntoStringCollection();
string [] linesArray = new string[linesCollection.Count];
linesCollection.CopyTo(linesArray, 0);
this.textBoxContents.Lines = linesArray;
}
StringCollection.CopyTo()的第二個參數表示目標數組中的下標,我們從該下標指定的位置開始復制集合。
下面看看ReadFileIntoStringCollection()方法。使用StreamReader讀取每一行文本。編譯時需要計算讀取的字符數,以確保不超出文本框的范圍:
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;
}
這就是該示例的完整代碼。
如果運行ReadWriteText,讀取NewFile.aspx文件,然后保存它,該文件的格式就是Unicode。任何常用的Windows應用程序(Notepand,Wordpad)都沒有提供這種格式,甚至ReadWriteText示例也只能在Windows NT/2000/XP/2003下正確讀取和顯示文件。因為Windows 9x不支持Unicode,像Notepad這樣的應用程序不能識別其他平臺上的Unicode文件(如果從Wrox Press網站上下載了這個示例,就可以試試)。但是,如果使用前面的ReadBinaryFile示例顯示文件,就會立即看出它們的區別,如圖30-10所示。最前面的兩個字節表示文件的格式是Unicode,之后,每個字符都用兩個字節來表示。這是非常明顯的,因為在這個文件中,每個字符的高位字節都是0,所以每隔一個字節就顯示x00。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

利川市| 内江市| 吐鲁番市| 湘阴县| 西宁市| 新龙县| 三原县| 洛南县| 黔东| 延津县| 新泰市| 循化| 和田县| 江陵县| 高淳县| 左贡县| 多伦县| 西华县| 甘德县| 平遥县| 无锡市| 安达市| 明光市| 上犹县| 南陵县| 井研县| 天门市| 巫溪县| 新建县| 武夷山市| 繁昌县| 泰兴市| 东港市| 兴海县| 江门市| 亚东县| 齐河县| 大化| 皋兰县| 云南省| 梅河口市|