C# Stream的使用之Filestream
流(Stream)是.NET Framework为程序提供的读写数据的方法。每个流都是抽象类Stream的子类,已经内置类很多流类用来完成不同的工作
1,Stream–>FileStream读写文件
, FileStream 类只能处理原始字节
(raw byte)。FileStream 类可以用于任何数据文件,而不仅仅是文本文件。FileStream 对象可以用于读取诸如图像和声音的文件,FileStream读取出来的是字节数组
,然后通过编码转换将字节数组转换
成字符串。
引用命名空间
using System.IO;
声明一个FileStream类的对象
FileStream fsRead = new FileStream(string path, FileMode mode, FileAccess access);
参数解析:
path:要操作的文件路径,路径可以是绝对路径或者相对路径。
//Directory.GetCurrentDirectory()保存到解决方案下的默认地址 file.FileName给的文件名
var filefullPath = Path.Combine(Directory.GetCurrentDirectory(), file.FileName);
mode:操作文件的方式,打开或者创建
access:操作文件中的数据,读取或者写入
实操
例子一 postman保存文件到本地
/// <summary>
/// postman上传文件到本地
/// </summary>
/// <param name="filename">保存文件名称</param>
/// <param name="file">文件</param>
/// <returns></returns>
[HttpPost]
public async Task<string> SaveFile([FromForm] string filename, IFormFile file)
{
return await Task.Run(() =>
{
try
{
//保存文件到本地
var filefullPath = Path.Combine(Directory.GetCurrentDirectory(), filename);
using (FileStream fs = new FileStream(filefullPath, FileMode.Create,FileAccess.ReadWrite))
{
file.CopyTo(fs);
fs.Flush();
}
}
catch (Exception ex)
{
return ex.Message;
}
return "保存成功";
});
}
例子二 读取本地txt文件返回内容到控制器
/// <summary>
/// 读取本地文件内容转json
/// </summary>
/// <returns></returns>
[HttpGet]
public string ReadByFileStream()
{
FileStream fsRead = new FileStream(@"D:\我的收藏\host前期建设详细程序\HostWebDetail\WebAPI\文件.txt", FileMode.OpenOrCreate, FileAccess.Read);
string s = "";
byte[] buffer = new byte[10000];//声明一个字节数组,用来临时存储读取到数据,最大存储255字节
while (true)
{
//每次读取buffer声明的最大的byte字节 最后叠加到string中
//如果读取的内容比byte字节少 则一次读完直接跳出循环 否则一直循环最大的byte读 知道txt读完 r为0 直到跳出循环位置
int r = fsRead.Read(buffer, 0, buffer.Length);//返回本次实际读取到的字节数
if (r == 0)//如果读取到的字节数为0,说明已到达文件结尾,则退出while循环
{
break;
}
s += Encoding.UTF8.GetString(buffer, 0, r);//将字节数组转换成字符串;buffer:要转换的字节数组;0:第一个要解码的字节的索引;r:要解码的字节数
Console.WriteLine(s);
}
fsRead.Close(); //关闭流
fsRead.Dispose(); //释放流
return s;
}
例子三 控制器写入内容到本地文件
注意:当使用filestream 不用using包裹的话 且未使用close dispose会造成文件被锁
/// <summary>
/// 程序写入内容至本地文件
/// </summary>
/// <returns></returns>
[HttpGet]
public void WriteByFileStream()
{
using (FileStream fsWrite = new FileStream(@"D:\我的收藏\host前期建设详细程序\HostWebDetail\WebAPI\文件1.txt", FileMode.Append, FileAccess.Write))
{
Console.WriteLine("请输入文本");//提示用户输入字符串
string str = Console.ReadLine();//接受用户输入的字符串
byte[] array = Encoding.UTF8.GetBytes(str);//将字符串转换成字节数组
fsWrite.Write(array, 0, array.Length);//将字节数组写入到文本文件
Console.WriteLine("写入成功");
//不需要关闭流 或者释放流 因为使用了using filestream继承了stream的close()
//fsWrite.Close(); //关闭流
//fsWrite.Dispose(); //释放流
}
//不推荐
//当不使用using时 也不关闭流 和释放流的 时候 查看文件时 会显示进程被占用 并无法正确的写入(错误)
//FileStream fsWrite = new FileStream(@"D:\我的收藏\host前期建设详细程序\HostWebDetail\WebAPI\文件1.txt", FileMode.Append, FileAccess.Write);
//Console.WriteLine("请输入文本");//提示用户输入字符串
//string str = Console.ReadLine();//接受用户输入的字符串
//byte[] array = Encoding.UTF8.GetBytes(str);//将字符串转换成字节数组
//fsWrite.Write(array, 0, array.Length);//将字节数组写入到文本文件
//Console.WriteLine("写入成功");
}
}
2, Stream–>MemoryStream读写内存块数据
Stream–>NetworkStream读写其他计算机或设备数据
Stream–>GZipStream压缩数据便于下载和存储
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix