C# - FileStream文件流,以字节流方式读/写不同类型数据 099
FileStream文件流是C#中众多流中的一种,其他的如网络流,内存流等,所有流都有一个共同的父类Stream(抽象类)
文件流:本质就是字节流,将如文本,视频,压缩包等类型的文件转换为字节的方式进行读取和写入,这个一个实例类,因此使用前必须实例化一个文件流对象
静态类File与实例类FileStream其作用都可以拷贝文件,两者只是工作方式有所不同
前者:将文件一次性进行读取/存储;后者:可指定大小,进行"分段"读取/存储
类比两个桶(一个有水,一个无水):使用前者一次性将水一次性倒入无水桶中,非常占用CPU内存,弄不好就死机;后者使用小桶,脸盘等中间容器进行"分段"操作,最终完成倒水操作
Stream不会将所有内容一次性读取到内存中,会有一个指针,其指到哪里就读/写到哪里
使用文件流的好处:不论多大的文件,每次只读取/写入指定大小的字节数,像蚂蚁搬家似的,不会一下占用过多的内存,导致内存崩溃
使用FileStream读取文件
FileStream类没有无参构造方法,因此使用其第三个重载的构造方法
FileStream(string path,FileMode.枚举值) //读取文件的路径 打开文件方式(可读可写)
//指定读取的源文件
string path = @"d:\test\2.txt";
//创建文件流对象,使用两个参数的构造方法
FileStream fs = new FileStream(path, FileMode.Open);
//设置中间容器(缓存区),这里设置为整个文件的大小
byte[] byts = new byte[fs.Length];
//读取文件
//参数1 byts: 表示每次读取到缓冲区的字节数
//假设 byte[] byts = new byte[1024*1024*5];
//就是设置了缓冲区为 5M 即每次读取的最大字节数为 5兆
//参数2 0: 表示从byts数组中的什么地方开始读取,一般为索引为0的字节开始
//参数3 表示此次读取了多少个字节(最大为缓冲区大小)
//fs.Length 是long 类型,参数需要的是int类型
//因此需要进行强转 (int)fs.Length 或使用 byts.Length
//r = fs.Read(byts, 0, byts.Length);
//r 表示每次实际读取到的字节数
//假设文件大小为13M,前两次读取为5M
//最后一次就只有3M 即 r 实际读取的字节数
int r = fs.Read(byts, 0, (int)fs.Length);
fs.Close();//关闭文件流连接
fs.Dispose();//释放相关占用的资源(内存)
Console.WriteLine(r);
文件流属于C#中非托管资源,因此需要手动关闭连接,释放占用的资源
读取文件步骤:
1)创建文件流对象(要读取文件的路径,文件打开方式,暂时只用Open,可读可写)
2)设置缓冲区大小:创建字节数组(根据文件大小自行设置跟内存,传输,存储速度等有关)
3)调用Read(读取的缓冲区,一般从0开始,要读取的字节数)
4)调用Close()与Dispose()方法,用来关闭并释放其占用的相关资源(以后会用using替代)
字符串与字节数组相互转换
使用位于System.Text命名空间下的Encoding类进行转换
//字符串转换字节数组
string str = "我爱北京天安门";
//使用UTF-8编码方式转换字符串
byte[] byts = Encoding.UTF8.GetBytes(str);
for (int i = 0; i < byts.Length; i++)
{
Console.Write("{0} ", byts[i]);
}
Console.WriteLine("");
//将字节数组转换为字符串
//使用源编码方式进行解码
str = Encoding.UTF8.GetString(byts);
Console.WriteLine(str);
使用FileStream写入文件
FileMode的几个枚举值:Open与OpenOrCreate适用于读取文件的操作,其余三个适用于写入文件的操作
//Append方式:将字符串追加到文件原有内容的末尾
FileStream fs = new FileStream(@"d:\test\5.txt", FileMode.Append);
string str = "使用文件流类FileStream追加到文件5.txt中";
byte[] byts = Encoding.UTF8.GetBytes(str);
fs.Write(byts, 0, byts.Length);
fs.Close();
fs.Dispose();
Console.WriteLine("追加成功");