理論上
可以使用FileStream類讀取和顯示文本文件
前面已經介紹了這個類
上面顯示NewFile
txt文件的格式不太容易理解
但這並不是FileStream類的問題——而在於我們在文本框中顯示結果所使用的方式
如果知道某個文件包含文本
通常就可以使用StreamReader 和 StreamWriter類更方便地讀寫它們
這是因為這些類工作的級別比較高
特別適合於讀寫文本
它們執行的方法可以根據流的內容
自動檢測出停止讀取文本較方便的位置
特別是
●這些類執行的方法可以一次讀寫一行文本(StreamReader
ReadLine() 和 StreamWriter
WriteLine())
在讀取文件時
流會自動確定下一個回車符的位置
並在該處停止讀取
在寫入文件時
流會自動把回車符和換行符添加到文本的末尾
●使用StreamReader 和 StreamWriter類
就不需要擔心文件中使用的編碼方式(文本格式)了
可能的編碼方式是ASCII(一個字節表示一個字符)或者基於Unicode的格式
UNICODE
UTF
和 UTF
Windows
x系統上的文本文件總是ASCII格式
因為Windows
x系統不支持Unicode
但Windows NT
XP和
都支持Unicode
所以文本文件除了包含ASCII數據之外
理論上可以包含Unicode
UTF
或 UTF
數據
其約定是
如果文件是ASCII格式
就只包含文本
如果是Unicode格式
就用文件的前兩個或三個字節來表示
這幾個字節可以設置為表示文件中格式的值的特定組合
這些字節稱為字節碼標記
在使用標准Windows應用程序打開一個文件時
例如Notepad 或 WordPad
不需要考慮這個問題
因為這些應用程序都支持不同的編碼方法
會自動正確地讀取文件
StreamReader類也是這樣
它可以正確讀取任何格式的文件
而StreamWriter類可以使用任何一種編碼技術格式化它要寫入的文本
另一方面
如果要使用FileStream類讀取和顯示文本文件
就不必自己處理這個過程了
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
);
另外
如果指定UTF
編碼方法
StreamReader sr = new StreamReader(@
C:
My Documents
ReadMe
txt
Encoding
UTF
);
使用類System
Text
Encoding上的幾個屬性之一
就可以指定編碼方法
這個類是一個抽象基類
可以根據這個類定義許多類
其方法可執行實際的文本編碼
每個屬性都返回相應類的一個實例
可以使用的屬性包括
●ASCII
●Unicode
●UTF
●UTF
●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()的重載方法可以把返回的字符轉換為一個整數
如果到達流的尾端
就返回
最後
可以用一個偏移值
把給定個數的字符讀到數組中
// to read
characters in
int nChars =
;
char [] charArray = new char[nChars];
int nCharsRead = sr
Read(charArray
nChars);
如果要求讀取的字符數多於文件中剩余的字符數
nCharsRead應小於nChars
StreamWriter類
StreamWriter類的工作方式與StreamReader的類似
但StreamWriter只能用於寫入文件(或另一個流)
構造StreamWriter的方法包括
StreamWriter sw = new StreamWriter(@
C:
My Documents
ReadMe
txt
);
上面的代碼使用了UTF
編碼方法
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()的
個重載方法來完成
最簡單的方式是寫入一個流
後面加上一個回車換行符
string nextLine =
Groovy Line
;
sw
Write(nextLine);
也可以寫入一個字符
char nextChar = ~a~;
sw
Write(nextChar);
也可以寫入一個字符數組
char [] charArray = new char[
];
// initialize these characters
sw
Write(charArray);
甚至可以寫入字符數組的一部分
int nCharsToWrite =
;
int startAtLocation =
;
char [] charArray = new char[
];
// initialize these characters
sw
Write(charArray
startAtLocation
nCharsToWrite);
ReadWriteText示例
ReadWriteText示例說明了StreamReader和StreamWriter類的用法
它非常類似於前面的ReadBinaryFile示例
但假定要讀取的文件是一個文本文件
並顯示其內容
它還可以保存文件(包括在文本框中對文本進行的修改)
它將以Unicode格式保存文件
圖
所示的ReadWriteText用於顯示前面的NewFile
aspx文件
但這次讀取內容會更容易一些
這裡不打算介紹給打開文件對話框添加事件處理程序的詳細內容
因為它們基本上與前面的BinaryFileReader示例相同
與這個示例相同
打開一個新文件
將調用DisplayFile()方法
其惟一的區別是DisplayFile的執行方式
本例有一個保存文件的選項
這由另一個菜單項save來表示
這個選項的處理程序調用我們添加到代碼中的另一個方法SaveFile()(注意
這個新文件總是重寫原來的文件——這個示例沒有寫入另一個文件的選項)
.NET編程免費提供,內容來源於互聯網,本文歸原作者所有。