——FileStream
FileSream操作的是字节数组,所以FileStream可以用来操作任何类型的文件
使用FileStream读写数据的步骤
- 创建FileStream实例对象
- 创建字节数组来限定每次读取数据的大小
- 执行读取数据操作,
- 对字节数组进行解码/编码操作
- 关闭流
- 释放流所占用的资源
string path=@"C:\Users\SpringRain\Desktop\new.txt";
FileStream stream = new FileStream(path,FileMode.OpenOrCreate, FileAccess.Read);
byte[] Buffer = new byte[1024 * 1024 * 5];
int R = stream.Read(Buffer, 0, Buffer.Length);
string str = Encoding.UTF8.GetString(buffer,0, r);
stream.Close();
stream.Dispose();
注意
- FileStream构造函数常用的三个参数
- 参数1——路径
- 参数2——枚举类型FileMode指定系统打开文件的方式(常用Append,OpenOrCreate)
- 参数3——枚举类型FileAccess,指明对文件中的数据操作(write,read)
- 创建的字节数组的作用
- 这个字节数组是用于储存读取出来的数据的,我们提前定义了数值大小,则数组中只能存那么多值这样就起到了限定的作用
- 在执行读取操作,往字节数组中填写数据的时候
- 如果读取出来的数据大小不够填充字节数组的大小,系统会用空格填充,但是可以在解码的时候可以指定截取字节数组中多少数据,用该步骤的返回值确定,该步骤返回一个int类型的值,表示读取到的实际字节的长度
- 参数1——用于存数据的字节数组
- 参数2——重读取文件的哪里开始读取
- 参数3——在文件中读取数据到哪个位置
- 对字节数组进行解码操作
- 参数1——解码的字节数组
- 参数2——开始解码位置
- 参数3——结束解码位置,其余的扔掉
上面的过程需要我手动的释放资源,微软也考虑到了这一点比较麻烦,所以提供了一种写法帮助我们自动释放资源,上面的过程就可以写成下面这样子
string path=@"C:\Users\SpringRain\Desktop\new.txt";
using (FileStream stream = new FileStream(path, FileMode.OpenOrCreate, FileAccess.Read)) {
byte[] Buffer = new byte[1024 * 1024 * 5];
int R=stream.Read(Buffer,0,Buffer.Length);
string str=System.Text.Encoding.UTF8.GetString(Buffer,0,R);
}
//Using会帮助我们自动释放资源
当然往一个文件中写入数据也是这样的,只需要改一点点参数就好了
string path=@"C:\Users\SpringRain\Desktop\new.txt";
using (FileStream fsWrite = new FileStream(path, FileMode.OpenOrCreate, FileAccess.Write))
{
string str = "Hello world";
byte[] buffer = Encoding.UTF8.GetBytes(str);
fsWrite.Write(buffer, 0, buffer.Length);
}
//这样王文件中写入数据的话会覆盖原有的数据,如果想往原来的文件中添加数据,就把FileMode.OpenOrCreate改为FileMode.Append
下面一个例子用读取和写入来实现多媒体文件的复制
using (FileStream fRead = new FileStream(soucre, FileMode.Open, FileAccess.Read)) {
using (FileStream fWrite = new FileStream(target, FileMode.Create, FileAccess.Write)) {
byte[] buffer = new byte[1024 * 1024 * 5];
while (true) {
int r = fRead.Read(buffer, 0, buffer.Length);
if (r == 0) break;
fWrite.Write(buffer, 0, r);
}
}
}
//我们创建一个负责读取的流
//创建一个负责写入的流
//因为文件可能会比较大,所以我们在读取的时候 应该通过一个循环去读取
//返回本次读取实际读取到的字节数
//如果返回一个0,也就意味什么都没有读取到,读取完了
——StreamReader
有时候我们只需要以流的方式读取文本数据,那么除了使用FileStream之外,还有一个更简单的方式——StramReader
string path = @"C:\Users\Blue\Desktop\项目站点.txt";
using (StreamReader sr = new StreamReader(path,Encoding.Default)) {
while (!sr.EndOfStream) {
Console.WriteLine(sr.ReadLine());
}
}
//StreamReader对象的EndOfStream属性是用来判断是否读取完了指定的文件
——StraemWriter
以流的方式写入文本数据
using (StreamWriter sw=new StreamWriter(path,true)){
sw.Write("I am Appended");
};
//如果省掉第二个bool参数,则会覆盖原文内容,第二参数表示是否为append