大家好,又见面了,我是你们的朋友全栈君。
1、简介
FileStream 类:主要用于对文件进行读取、写入、打开和关闭操作,并对其他与文件相关的操作系统句柄进行操作,如管道、标准输入和标准输出。读写操作可以指定为同步或异步操作。FileStream 对输入输出进行缓冲,从而提高性能。——MSDN
**简单点说:FileStream类可以对任意类型的文件进行读取操作,可根据需要来指定每次读取的字节长度(这是比File类优秀的地方之一),以此减少内存的消耗,提高读取效率。
2、File和FileStream的区别
File是一个静态类;FileStream是一个非静态类。
**最直接区别:将读取文件比作是从A桶往B桶运水。使用File就是整个用桶倒进去,使用FileStream就是使用水管慢慢输送,应用场景不同,大文件推荐FileStream,不会炸内存。
File:是一个文件的类,对文件进行操作。其内部封装了对文件的各种操作(MSDN:提供用于创建、复制、删除、移动和打开单一文件的静态方法,并协助创建FileStream对象)。
FileStream:是一个文件流的类,处理文件的原始字节,即处理byte[]。对txt,xml,avi等任何文件进行内容写入、读取、复制…
3、FileStream的用法示例
3.1 注意用using主动释放内存
using有两个主要用途:
1、作为指令,用于为命名空间创建别名或导入其他命名空间中定义的类型。
2、作为语句,用于定义一个范围,在此范围的末尾将释放对象,using的对象必须是实现IDisposable接口的。
这里用到了第二种,如果一个类实现了接口IDisposable(这个接口只有一个方法void Dispose()),当这个类在using中创建的时候,using代码块结束时会自动调用这个类中实现了接口IDisposable的Dispose()方法,也就是释放资源。一般来说,文件流都要主动释放资源的,因为读写文件是会加锁的,不释放的话,别的程序就无法使用文件了,这也就是FileStream一般和using配套使用的原因。当然,也可以不用using,但是在用完后需要显示调用三行代码: fs.Flush();//清除缓冲区 fs.Close();//关闭 fs.Dispose();//释放
代码示例:
代码语言:javascript复制 static void Main(string[] args)
{
using (FileStream fs = new FileStream(@"C:UsersawangDesktop1.txt", FileMode.OpenOrCreate, FileAccess.Read))
{//在using中创建FileStream对象fs,然后执行大括号内的代码段,
//执行完后,释放被using的对象fs(后台自动调用了Dispose)
byte[] vs = new byte[1024];//数组大小根据自己喜欢设定,太高占内存,太低读取慢。
while (true) //因为文件可能很大,而我们每次只读取一部分,因此需要读很多次
{
int r = fs.Read(vs, 0, vs.Length);
string s = Encoding.UTF8.GetString(vs, 0, r);
Console.WriteLine(s);
if (r == 0) //当读取不到,跳出循环
{
break;
}
}
}
Console.ReadKey();
}
3.2 读文件一般步骤
读文件即3.1中代码段,其中有以下重点:
1. FileStream fs = new FileStream(@”C:UsersawangDesktop1.txt”, FileMode.OpenOrCreate, FileAccess.Read)
该构造函数有很多重载,上面用的是最最常用的一个。第一个参数填路径;第二个参数选择形式,选择openorcreate最保险,文件不存在就创建一个;第三个参数选read,即读取。
2. byte[] vs = new byte[1024]
新建缓存数组,数组大小根据自己喜欢设定(注意:太高占内存,太低读取慢。)
3. 循环读取数据,对应while循环代码(因为文件可能很大,而我们每次只读取一部分,因此需要读很多次,当读取完后,跳出循环)。
3.3 写文件一般步骤
代码语言:javascript复制 static void Main(string[] args)
{
string s = "写入文件写入文件写入文件写入文件写入文件写入文件";
using (FileStream fs = new FileStream(@"C:UsersawangDesktop1.txt", FileMode.OpenOrCreate, FileAccess.Write))
{//在using中创建FileStream对象fs,然后执行大括号内的代码段,
//执行完后,释放被using的对象fs(后台自动调用了dispose)
byte[] buffer = Encoding.UTF8.GetBytes(s); //把要写入的东西转换成byte数组
fs.Write(buffer, 0, buffer.Length); //写入
}
Console.ReadKey();
}
其中有以下重点:
FileStream fs = new FileStream(@”C:UsersawangDesktop1.txt”, FileMode.OpenOrCreate, FileAccess.Write)
第一个参数填路径;第二个参数选择形式,选择openorcreate最保险,文件不存在就创建一个;第三个参数选Write,即写入。
3.4 复制大文件一般步骤(读写同步)
代码语言:javascript复制 static void Main(string[] args)
{
string sourcePath = @"C:UsersawangDesktopsource.mp4";//需要被复制的文件的路径
string targetPath = @"C:UsersawangDesktoptarget.mp4";//复制到的路径
using (FileStream fsRead = new FileStream(sourcePath, FileMode.OpenOrCreate, FileAccess.Read))
{//创建读取文件的流
using (FileStream fsWrite = new FileStream(targetPath, FileMode.OpenOrCreate, FileAccess.Write))
{//创建写入文件的流
byte[] buffer = new byte[1024 * 1024 * 2];//缓存设置2MB;
while (true)//循环读取
{
int r = fsRead.Read(buffer, 0, buffer.Length);//读数据
if (r == 0)//读不到数据了,跳出循环
{
break;
}
fsWrite.Write(buffer, 0, r);//写数据
}
}
}
Console.WriteLine("复制完成!");
Console.ReadKey();
}
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/162870.html原文链接:https://javaforall.cn