FielStream類操作的是字節和節節數組,而stream類操作的是字符數據。字符數據易於使用,但是有些操作,比如隨機文件訪問(訪問文件中間某點的數據),就必須由FileStream對象執行。
FielStream類維護內部文件指針,該指針指向文件中進行下一次讀寫操作的位置。
FileStream只能處理原始字節(raw byte),處理原去吧字節的功能使用FileStream類可以用於處理任何數據文件。
通過讀取字節數據,FileStream對像可以用於讀取圖像和聲音。代價是FileStream類不能將數據直接讀入字符串
此指針可以修改用Seek方法,它有兩個參數:
第一個參數:規定文件指針以字節為參數的移動距離
第二個參數:規定開始計算的起始位置
byte
[] byDataValue
=
new
byte
[
200
];
char
[] charDataValue
=
new
char
[
200
];
///
<summary>
///
FilesStream讀取用法
///
</summary>
private
void
FilesStreamReadFile()
{
try
{
FileStream fsFile
=
new
FileStream(
@"
d:\log.cs
"
, FileMode.Open);
//
文件指針移到文件的135個字節
fsFile.Seek(
135
, SeekOrigin.Begin);
//
將接下來的字節讀到Array中
fsFile.Read(byDataValue,
0
,
200
);
}
catch
(Exception e)
{
throw
e;
}
//
將字節轉換成字符
Decoder dc
=
Encoding.UTF8.GetDecoder();
//
字節數組轉換成字符數組,便於顯示
dc.GetChars(byDataValue,
0
, byDataValue.Length, charDataValue,
0
);
}
///
<summary>
///
FilesStream寫入用法
///
</summary>
private
void
FileStreamWriteFile()
{
FileStream fsFile
=
new
FileStream(
@"
D:\log.txt
"
, FileMode.Create);
charDataValue
=
"
This is test string
"
.ToCharArray();
byDataValue
=
new
byte
[charDataValue.Length];
//
將字符數組轉換成字節數組
Encoder ec
=
Encoding.UTF8.GetEncoder();
ec.GetBytes(charDataValue,
0
,charDataValue.Length,byDataValue,
0
,
true
);
//
將指針設定起始位置
fsFile.Seek(
0
,SeekOrigin.Begin);
//
寫入文件
fsFile.Write(byDataValue,
0
,byDataValue.Length);
}
FileStream對象通常會在StreamWriter或StreamReader內使用,並使用它們的方法處理文件。
///
<summary>
///
StreamWriter寫入方法
///
</summary>
private
void
StreamWriterMetod()
{
try
{
FileStream fsFile
=
new
FileStream(
@"
d:\log.txt
"
,FileMode.OpenOrCreate);
StreamWriter swWriter
=
new
StreamWriter(fsFile);
//
寫入數據
swWriter.WriteLine(
"
Hello Wrold.
"
);
swWriter.WriteLine(
"
It is now {0}
"
, DateTime.Now.ToLongDateString());
swWriter.Close();
}
catch
(Exception e)
{
throw
e;
}
}
///
<summary>
///
StreamWriter讀取方法
///
</summary>
private
void
StreamReaderMetod()
{
string
sLine
=
""
;
try
{
FileStream fsFile
=
new
FileStream(
@"
d:\log.txt
"
, FileMode.Open);
StreamReader srReader
=
new
StreamReader(fsFile);
//
讀取文件(讀取大文件時,最好不要用此方法)
sLine
=
srReader.ReadToEnd();
txbValue.Text
=
sLine;
srReader.Close();
}
catch
(Exception e)
{
throw
e;
}
}
///
<summary>
///
StreamWriter讀取方法2
///
</summary>
private
void
StreamReaderMetodTwo()
{
try
{
FileStream fsFile
=
new
FileStream(
@"
d:\log.txt
"
, FileMode.Open);
/*
* 讀取數據最簡單的方法是Read()。此方法將流的下一個字符作為正整數值返回,
* 如果達到了流的結尾處,則返回-1。
*/
StreamReader srReader
=
new
StreamReader(fsFile);
int
iChar;
iChar
=
srReader.Read();
while
(iChar
!=
-
1
)
{
txbValue.Text
+=
(Convert.ToChar(iChar));
iChar
=
srReader.Read();
}
srReader.Close();
}
catch
(Exception e)
{
throw
e;
}
}
注:FileMode
枚舉成員值在文件存在與不存在時的情況
成員 |
文件存在時 |
文件不存在時 |
Append |
打開文件,流指向文件的末尾,只能與枚舉FileAcess.Write聯合使用 |
創建一個新文件。只能與枚舉FileAcess.Write聯合使用 |
Create |
刪除該文件,然後創建新文件 |
創建新文件 |
CreateNew |
拋出異常 |
創建新文件 |
Open |
打開現有文件,流指向文件開頭 |
拋出異常 |
OpenOrCreate |
打開文件,流指向文件開頭 |
創建新文件 |
Truhncate |
打開現有文件,清除其內容。流指向文件開頭,保留文件的初始創建日期。 |
拋出異常 |