您好,登錄后才能下訂單哦!
理論上,可以使用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類讀取和顯示文本文件,就不必自己處理這個過程了。
圖 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。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。