FileStream對(duì)象表示在磁盤(pán)或網(wǎng)絡(luò)路徑上指向文件的流。這個(gè)類提供了在文件中讀寫(xiě)字節(jié)的方法,但經(jīng)常使用StreamReader或 StreamWriter執(zhí)行這些功能。這是因?yàn)镕ileStream類操作的是字節(jié)和字節(jié)數(shù)組,而Stream類操作的是字符數(shù)據(jù)。這是這兩種類的一個(gè)重要區(qū)別,如果你是準(zhǔn)備讀取byte數(shù)據(jù)的話,用StreamReader讀取然后用 System.Text.Encoding.Default.GetBytes轉(zhuǎn)化的話,如下,則可能出現(xiàn)數(shù)據(jù)丟失的情況,如byte數(shù)據(jù)的個(gè)數(shù)不對(duì)等。因此操作byte數(shù)據(jù)時(shí)要用FileStream。
string textContent = fileStream.ReadToEnd();byte[] bytes = System.Text.Encoding.Default.GetBytes(textContent);
字符數(shù)據(jù)易于使用, 但是有些操作,比如隨機(jī)文件訪問(wèn)(訪問(wèn)文件中間某點(diǎn)的數(shù)據(jù)),就必須由FileStream對(duì)象執(zhí)行.
其中創(chuàng)建FileStream對(duì)象最簡(jiǎn)單的構(gòu)造函數(shù)如下:
1
FileStream file = new FileStream(fileName,FileMode.Member);
2
FileStream file = new FileStream(fileName, FileMode.Member, FileAccess.Member);
而FileAccess的成員:
成 員
說(shuō) 明
Read
打開(kāi)文件,用于只讀
Write
打開(kāi)文件,用于只寫(xiě)
ReadWrite
打開(kāi)文件,用于讀寫(xiě)
對(duì)文件進(jìn)行不是FileAccess枚舉成員指定的操作會(huì)導(dǎo)致拋出異常。此屬性的作用是,基于用戶的身份驗(yàn)證級(jí)別改變用戶對(duì)文件的訪問(wèn)權(quán)限。
在FileStream構(gòu)造函數(shù)不使用FileAccess枚舉參數(shù)的版本中,使用默認(rèn)值FileAccess. ReadWrite。
FileMode枚舉成員,使用每個(gè)值會(huì)發(fā)生什么,取決于指定的文件名是否表示已有的文件。
成 員
文 件 存 在
文件不存在
Append
打開(kāi)文件,流指向文件的末尾,只能與枚舉FileAccess.Write聯(lián)合使用
創(chuàng)建一個(gè)新文件。只能與枚舉FileAccess.Write聯(lián)合使用
Create
刪除該文件,然后創(chuàng)建新文件
創(chuàng)建新文件
CreateNew
拋出異常
創(chuàng)建新文件
Open
打開(kāi)現(xiàn)有的文件,流指向文件的開(kāi)頭
拋出異常
OpenOrCreate
打開(kāi)文件,流指向文件的開(kāi)頭
創(chuàng)建新文件
Truncate
打開(kāi)現(xiàn)有文件,清除其內(nèi)容。流指向文件的開(kāi)頭,保留文件的初始創(chuàng)建日期
拋出異常
FileStream類操作的是字節(jié)和字節(jié)數(shù)組,而Stream類操作的是字符數(shù)據(jù)
StreamWriter允許將字符和字符串寫(xiě)入文件,它處理底層的轉(zhuǎn)換,向FileStream對(duì)象寫(xiě)入數(shù)據(jù)。StreamReader也類似。
實(shí)例:
1
using System;
2
using System.Data;
3
using System.IO;
4
using System.Text;
5
6
/**//// <summary>
7
/// Summary description for FileReadAndWrite
8
/// </summary>
9
public class FileReadAndWrite
10
{
11
public FileReadAndWrite()
12
{
13
//
14
// TODO: Add constructor logic here
15
//
16
}
17
/**//// <summary>
18
/// 用FileStream寫(xiě)文件
19
/// </summary>
20
/// <param name="str"></param>
21
/// <returns></returns>
22
public void FileStreamWriteFile(string str)
23
{
24
byte[] byData;
25
char[] charData;
26
try
27
{
28
FileStream nFile = new FileStream("love.txt", FileMode.Create);
29
//獲得字符數(shù)組
30
charData = str.ToCharArray();
31
//初始化字節(jié)數(shù)組
32
byData = new byte[charData.Length];
33
//將字符數(shù)組轉(zhuǎn)換為正確的字節(jié)格式
34
Encoder enc = Encoding.UTF8.GetEncoder();
35
enc.GetBytes(charData, 0, charData.Length,byData,0,true);
36
nFile.Seek(0, SeekOrigin.Begin);
37
nFile.Write(byData, 0, byData.Length);
38
}
39
catch (Exception ex)
40
{
41
throw ex;
42
}
43
}
44
/**//// <summary>
45
/// FileStream讀取文件
46
/// </summary>
47
/// <param name="filePath"></param>
48
/// <returns></returns>
49
public string FileStreamReadFile(string filePath)
50
{
51
byte[] data = new byte[100];
52
char[] charData = new char[100];
53
try
54
{
55
FileStream file = new FileStream(filePath, FileMode.Open);
56
//文件指針指向0位置
57
file.Seek(0, SeekOrigin.Begin);
58
//讀入兩百個(gè)字節(jié)
59
file.Read(data, 0, 200);
60
//提取字節(jié)數(shù)組
61
Decoder dec = Encoding.UTF8.GetDecoder();
62
dec.GetChars(data, 0, data.Length, charData, 0);
63
}
64
catch (Exception ex)
65
{
66
throw ex;
67
}
68
return Convert.ToString(charData);
69
}
70
/**//// <summary>
71
/// StreamWriter寫(xiě)文件
72
/// </summary>
73
public void StreamWriterWriteFile()
74
{
75
try
76
{
77
FileStream nFile = new FileStream("love.txt", FileMode.CreateNew);
78
StreamWriter writer = new StreamWriter(nFile);
79
80
writer.WriteLine("I love You!");
81
writer.WriteLine("Do you love me!");
82
writer.Close();
83
}
84
catch
85
{ }
86
}
87
/**//// <summary>
88
/// StreamReader讀取文件
89
/// </summary>
90
/// <returns></returns>
91
public string StreamReaderReadFile()
92
{
93
string str="";
94
try
95
{
96
FileStream file = new FileStream("love.txt", FileMode.Open);
97
StreamReader sr = new StreamReader(file);
98
while (sr.ReadLine()!=null)
99
{
100
str += sr.ReadLine();
101
}
102
//或者str = sr.ReadToEnd();
103
sr.Close();
104
}
105
catch
106
{ }
107
return str;
108
}
109
}
110