⽂件流详解
⽂件流
⼀、流的概述
要完成⽂件的读写操作,就必须了解C#中另外⼀个重要的概念——流(Stream)
C#中流的概念可以和⽣活中的流相对应。在⽣活中有⽔流和电流,⾸先要有⼀个源头,还需要有传输的管道,
⽔流有河道、⽔管作为传输管道,电流有电线,⽽这些流都会有⼀个⽬的,就是它的流向。C#的流也需要源头——⽂件、数据流⼊流出管道以及数据的访问。
1、输出流和输⼊流
.Net Framework中进⾏的所有输⼊、输出⼯作都需要⽤到流。
1、输出流:当向某些外部⽬标写⼊数据时,就要⽤到输出流。
2、输⼊流:⽤于将数据读到程序访问的内存或变量中。
在程序的控制台中的可以理解为:
输出流:控制台程序中,将信息从程序中输出的处理:Console.WriteLine();
输⼊流:通过⽤户键盘来输⼊到程序当中处理:Console.ReadLine();
2、⽂件读写,常⽤的三个类
对于⽂件读写,常见的三个类:
1、FileStream(⽂件流):这个类主要⽤于在⼆进制⽂件中读写⼆进制数据——也可以使⽤它读写任何⽂件。
2、StreamWriter(流写⼊器)和StreamReader(流读取器):这⼆个类是专门⽤来读写⽂本⽂件的。
⼆、FileStream对象
### 1、FileStream对象的⼆种重载
FileStream对象表⽰在磁盘或⽹络路径上指向⽂件的流。这个类提供了在⽂件中读写字节的⽅法。
有多种⽅法可以创建FileStream对象,FileStream类的构造函数有很多的重载版本,最简单的重载版本仅带有⼆个参数,即⽂件路径和FileModel枚举值。
1.1、第⼀种重载:
FileStream aFile = new FileStream( ⽂件路径 , FileMode.成员值);
FileModel的枚举成员:
成员值:⽂件存在:⽂件不存在:
Append打开⽂件,流指向⽂件的末尾,只能与枚举FileAccess.Write联合使⽤创建⼀个新⽂件。只能与枚举FileAccess.Write联合
使⽤
Create删除该⽂件,然后创建新⽂件创建新⽂件
CreateNew抛出异常创建新⽂件
Open打开现有⽂件,流指向⽂件的开头抛出异常
OpenOrCreate打开现有⽂件,流指向⽂件的开头创建新⽂件
Truncate打开现有⽂件,清楚其内容。流指向⽂件的开头,保留⽂件的初始创建
抛出异常
⽇期。
1.2、第⼆种重载:
FileStream aFile = new FileStream( ⽂件路径, FileMode.成员值, FileAccess.成员值);
FileAccess的枚举成员:
成员值:说明:
Read打开⽂件,⽤于只读
Write打开⽂件,⽤于只写
ReadWrite打开⽂件,⽤于读写
在FileAccess构造函数不使⽤FileAccess枚举参数的版本中,使⽤默认值FileAccess.ReadWrite。
File和FileInfo类中都提供了OpenRead()和OpenWrite()⽅法,使程序更易于创建FileStream对象。前者打开了只读访问的⽂件,后者只允许写⼊⽂件。
这些都提供了快捷⽅式,因此不⼀定要以FileStream构造函数的参数形式提供前⾯所有的信息。例如,下⾯的代码⾏打开了⽤于只读访问的⽂件。
FileStream aFile=File.OpenRead(@“C:\”);
或者
FileInfo aFileInfo=new FileInfo(@“C:\”);
FileStream aFile=afileInfo.OpenRead();
2、使⽤FileStream读取数据和写⼊数据
使⽤FileStream类读取数据并不容易,这是因为FileStream类只能处理原始字节(Raw Byte)。
FileStream对象的Read()⽅法是从FileStream对象所指向的⽂件访问数据的主要⼿段。这个⽅法从
⽂件中读取数据,再把数据写⼊⼀个字节数组。
该⽅法有三个参数:第⼀个参数是传⼊的字节数组,⽤以接收FileStream对象中的数据。第⼆个参数是字节数组中开始写⼊数据的位置。通常是0,表⽰从数组开端开始放置读⼊的字节。最后⼀个参数指定从⽂件中读出多少字节。
2.1、读取数据:
在编写程序代码前,需导⼊Sysytem.IO命名空间。此应⽤程序打开了磁盘上某个⽂件,⽤于读取其中的部分数据。⾸先,通过实例化⼀个FileStream的对象,将流指向这个⽂件。
这可以通过:
FileInfo aFileInfo =new FileInfo(@"C:\My ");
FileStream aFileInfo =aFileInfo.OpenRead();
步骤:创建FileStream对象,并指向⽂件流——得到⽂件⼤⼩(字节单位)——创建⼀个相同⼤⼩的字节数组——将⽂件的字节内容读到数组中——将数组中字节转为字符——输出显⽰——关闭流
/// <summary>
/// 读取数据
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button1_Click(object sender, EventArgs e)
{
//以只读⽅式创建FileStream对象
FileStream afile = new FileStream(@"C:\My ",FileMode.OpenOrCreate);
//得到⽂件的长度/⼤⼩
long length = afile.Length;
/
/使⽤⽂件的长度创建⼀个字节数组。
byte[] Buffers = new byte[length];
//将流中的数据的字节内容读到字节数组中
afile.Read(Buffers, 0, Buffers.Length);
//将读到的数据进⾏转码,转为字符串
string content = Encoding.Default.GetString(Buffers, 0, Buffers.Length);
//将字符串在⽂件框中显⽰
richTextBox1.AppendText(content);
//关闭流对象,释放⽂件引⽤。
afile.Close();
}
2.2、写⼊数据:
步骤:创建FileStream对象,并指向⽂件流——声明⼀个数组是写⼊数据字节的2倍——使⽤Encoding类的GetBytes()⽅法将字符串中的⼀组字符编码到字节数组中,(1、编码的字符集的字符串,2、表明第⼀个编码的字符的索引,3、要编码的字符的数量,4、表明要包含所产⽣的字节序列的字节数组,5、开始写⼊所产⽣的字节序列索引位置)
/// <summary>
/// 写⼊数据
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button2_Click(object sender, EventArgs e)
{
/
/创建⼀个写⽂件的⽂件流对象
FileStream aFile = new FileStream(@"C:\My ",FileMode.OpenOrCreate, FileAccess.Write);
//创建字节数组
byte[] buffers;
//获取传⼊闻见的字符串
string content = richTextBox1.Text;
//为字节数组分配字符串
//可能会包含中⽂,可以将长度设为字符串长度的⼆倍
buffers = new byte[content.Length * 2];
//将字符串转成字节放⼊字节数组中
Encoding.Default.GetBytes(content, 0, content.Length, buffers, 0);
//将字节数组写⼊⽂件中
aFile.Write(buffers, 0, buffers.Length);
//关闭流对象,释放⽂件引⽤。
aFile.Close();
}
三、StreamWrite和StreamReader对象
1、StreamWriter对象
StreamWriter对象只能⽤于写⼊⽂件(或另⼀个流),StreamWriter类的构造⽅法有很多版本。最常⽤的有以下三种。
(1)StreamWriter sw=new StreamWriter(@ “C:\”);
将使⽤UTF-8的编码⽅式创建StreamWriter对象,.NET把这种编码设置为默认的编码⽅式。
(2)StreamWriter sw=new StreamWriter(@ “C:\”, true);
在这个构造函数中,第⼆个参数是bool类型,表⽰⽂件是否以追加的⽅式打开。
(3)StreamWriter sw=new StreamWriter(@ “C:\”,true,Ecoding.ASCII);
在第三个函数中,第三个参数可以指明要使⽤的编码⽅式ASCII来创建StreamWriter对象。但不能仅以⽂件名和编码⽅式来创建对象。
当然,也可以将StreamWriter关联到⼀个⽂件流上,以获得打开⽂件的更多控制选项。例如以下代码。
FileStream fs=new FileStream(@“C:\1.txt”,FileMode.Append,FileAccess.Write);
StreamWriter sw=new StreamWriter(fs);
StreamWriter对象有两个⽅法来完成向⽂件或流中写⼊数据的功能。
WriteLine()⽅法:⼀次写⼊⼀⾏⽂本,流会⾃动把回车符合换⾏符添加到⽂本的末尾。
Write()⽅法:向流或⽂件中写⼊⽂本,但不会在末尾添加回车和换⾏符。
StreamWriter对象和FileStream对象⼀样,功能执⾏完毕后要使⽤Close()⽅法关闭以释放资源。
2、StreamReader对象
StreamReader对象⽤于读取⽂本⽂件。⽤某些⽅式构造StreamReader对象要⽐构造FileStream对象更简单,因为使⽤StreamReader时不需要FileStream的⼀些选项。特别是不需要模式和访问类型,因为它只能执⾏读取操作。
StreamReader类的构造⽅法的版本⽐较多,最简单的构造函数只带⼀个⽂件名参数。
StreamReader sr=new StreamReader(@“C:\”);
StreamReader sr=new StreamReader(@“C:\”,Encoding.UTF8);
也可以把StreamReader关联到FileStream对象上。例如以下代码。
writeline输出数值变量FileStream fs=new FileStream(@ “C:\”,FileMode.Open,FileAccess.Read);
StreamReader sr=new StreamReader(fs);
StreamReader对象读取数据的⽅法主要有三个。
(1) Read()⽅法:此⽅法每次读取⼀个字符,返回的是代表这个字符的⼀个正数,当独到⽂件末
尾时返回的是-1。
(2) ReadLine()⽅法:此⽅法每次读取流中的⼀⾏数据,但不包括回车和换⾏符。当读到⽂件末尾将返回null。
(3) ReadToEnd()⽅法:此⽅法⼀次性读取⽂件中的所有数据。
3、使⽤StreamWriter对象写⼊数据和StreamReader对象读取数据
3.1、StreamWriter对象写⼊数据
//读取数据
private void button1_Click(object sender, EventArgs e)
{
//创建StreamReader对象
//编码⽅式和写⼊数据时保持⼀致
StreamReader sr = new StreamReader(@"C:\My ", Encoding.Default);
//利⽤StreamReader对象的ReadToEnd()⽅法读取⽂件中所有数据
richTextBox1.Text = sr.ReadToEnd();
//关闭StreamReader对象以释放资源
sr.Close();
}
3.2、StreamReader对象读取数据
//写⼊数据
private void button2_Click(object sender, EventArgs e)
{
//创建StreamWriter对象
StreamWriter sw = new StreamWriter(@"C:\My ", true, Encoding.Default);
//获取输⼊数据的⽂件并放⼊数组
string[] data = richTextBox1.Lines;
//遍历字符串数组
foreach (string line in richTextBox1.Lines)
{
//将⽂本通过StreamWriter对象逐⾏写⼊⽂件
sw.WriteLine(line);
}
//关闭StreamWriter对象以释放资源
sw.Close();
}
四、总结
1、如果要对⽂件的内容进⾏读写,就需要⽤到流。
2、FileStream只能处理原始字节(Raw Byte)。处理原始字节的功能使FileStream类可以⽤于任何数据⽂件,⽽不仅仅是⽂本⽂件。通过读取字节数据,FileStream对象可以⽤于读取图像和声⾳的⽂件。这种灵活性的代价是,不能使⽤FileStream对象直接读⼊字符串,需要将字节数组转换为字符数组或者字符串。
3、虽然直接操作FileStream对象可以读取和显⽰⽂本⽂件,但是操作字节数组⽐较⿇烦。如果知道某个⽂件包含⽂本,通常就可以使⽤StreamWriter和StreamReader类更⽅便的对这些⽂件进⾏写⼊和读,⽽不是FileStream对象。这是因为这些类⼯作的级别⽐较⾼,特别适合于读写⽂本。它们执⾏的⽅法可以根据流的内容,⾃动检测出停⽌读取⽂本较⽅便的位置。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。