您的位置:首页 > 教程 > C#教程 > C# 将 Stream 保存到文件的方法

C# 将 Stream 保存到文件的方法

2022-08-05 19:53:23 来源:易采站长站 作者:

C# 将 Stream 保存到文件的方法

在拿到一个 Stream 如何优雅将这个 Stream 保存到代码

最优雅的方法应该是通过 CopyTo 或 CopyToAsync 的方法

using (var fileStream = File.Create("C:\\lindexi\\File.txt"))
{
    inputStream.Seek(0, SeekOrigin.Begin);
    iputStream.CopyTo(fileStream);
}

这里的 inputStream.Seek(0, SeekOrigin.Begin); 不一定需要,请根据你自己的需求,如你只需要将这个 Stream 的从第10个byte开始复制等就不能采用这句代码

用异步方法会让本次写入的时间长一点,但是会让总体性能更好,让 CPU 能处理其他任务

using (var fileStream = File.Create("C:\\lindexi\\File.txt"))
{
    await iputStream.CopyToAsync(fileStream);
}

注意使用 CopyToAsync 记得加上 await 哦,执行到这句代码的时候,就将执行交给了 IO 了,大部分的 IO 处理都不需要 CPU 进行计算,这样能达到总体性能更好

另外如果 iputStream 是外面传入的,那么我不建议在这个方法里面释放,为什么呢?我用的好好的一个Stream传入一个业务就被干掉了

其次的方法是自己控制内存复制缓存,此方法将会多出一次内存复制

public static void CopyStream(Stream input, Stream output)
{
    byte[] buffer = new byte[1024];
    int len;
    while ( (len = input.Read(buffer, 0, buffer.Length)) > 0)
    {
        output.Write(buffer, 0, len);
    }    
}
 
// 使用方法如下
using (Stream file = File.Create("C:\\lindexi\\File.txt"))
{
    CopyStream(input, file);
}

此方法的作用就是让你修改 new byte[1024] 的值,让你可以控制复制的缓存

接下来就是一些不推荐的方法了,但是写的时候方便

using (var stream = new MemoryStream())
{
    input.CopyTo(stream);
    File.WriteAllBytes(file, stream.ToArray());
}

上面这个方法将会复制两次内存,而且如果 input 这个资源长度有 1G 就要占用 2G 的资源

和上面差不多的是申请一个大的缓存,如下面代码:

public void SaveStreamToFile(string fileFullPath, Stream stream)
{
    if (stream.Length == 0) return;
 
    using (FileStream fileStream = System.IO.File.Create(fileFullPath, (int)stream.Length))
    {
        byte[] bytesInStream = new byte[stream.Length];
        stream.Read(bytesInStream, 0, (int)bytesInStream.Length);
 
        fileStream.Write(bytesInStream, 0, bytesInStream.Length);
     }
}

从效率和代码的优雅其实都不如 CopyTo 方法,而且因为 stream.Length 作为长度没有决定缓存,所以也不如第二个方法

下面是一个超级慢的方法,一个 byte 一个 byte 写入的速度是超级慢的

public void SaveStreamToFile(Stream stream, string filename)
{  
   using(Stream destination = File.Create(filename))
   {
       Write(stream, destination);
   }
}
 
public void Write(Stream from, Stream to)
{
      for(int a = from.ReadByte(); a != -1; a = from.ReadByte())
      {
      	to.WriteByte( (byte) a );
      }
}

如有侵权,请发邮件到 [email protected]

相关文章

  • vs2019安装和使用详细图文教程

    vs2019安装和使用详细图文教程

    vs2019已经在4月2日正式发布,vs2019发布会请看这个链接: vs2019发布活动 vs2019和vs2017一样强大,项目兼容,不用互相删除,而且C/C++,Python,F#,ios,Android,Web,Node.js,Azure,Unity,HTML,
    2020-03-10
  • VS2019使用快捷键将代码对齐的方法

    VS2019使用快捷键将代码对齐的方法

    1、选中需要对齐的行 2、CTRL+K 3、CTRL+F 对齐前: 对齐后: 补充:VS中代码对齐等快捷键 在VS2008中,选定代码后,按Ctrl+K+F组合键,可以自动进行代码对齐。 注意:要先按下Ctrl和K,再按
    2020-04-01
  • c# 类成员初始化顺序的特殊情况

    c# 类成员初始化顺序的特殊情况

    这里直接给出C#类成员一般初始化顺序: 子类静态字段 子类静态构造 子类实例字段 父类静态字段 父类静态构造 父类实例字段 父类实例构造 子类实例构造 为什么说是“一般”初始化
    2020-06-30
  • 使用Visual Studio2019创建C#项目(窗体应用程序、控制台应用程序、

    使用Visual Studio2019创建C#项目(窗体应用程序、控制台应用程序、

    一、VS的开发环境 首先你得安装了vs2019,然后确认下下面三个组件是否存在,如果没有要下载一下。vs2019的安装可参考visual studio2019的安装以及使用。 二、创建C#窗体应用程序 打开vs 可
    2020-03-08
  • C# XML字符串包含特殊字符的处理转换方法小结

    C# XML字符串包含特殊字符的处理转换方法小结

    为了能正常输出XML格式的内容,必须要对不被XML允许的那些特殊字符进行转换。本文介绍的正是如何使用C#判断XML字符串是否含特殊字符并进行转换。 以下是几个特殊字符的对应实体。
    2020-07-01
  • Unity实现俄罗斯方块游戏

    Unity实现俄罗斯方块游戏

    本文实例为大家分享了Unity实现俄罗斯方块游戏的具体代码,供大家参考,具体内容如下 一、演示 二、实现思路 创建每一个方块可移动到的位置点,可以理解为创建一个游戏地图,从
    2020-06-21
  • c# Newtonsoft 六个值得使用的特性(上)

    c# Newtonsoft 六个值得使用的特性(上)

    一:讲故事 看完官方文档,阅读了一些 Newtonsoft 源码,对它有了新的认识,先总结 六个超经典又实用的特性,同大家一起分享,废话不多说,快来一起看看吧~~~ 二:特性分析 1. 代码格
    2020-06-23
  • c#压缩字符串的方法

    c#压缩字符串的方法

    一:背景 1. 讲故事 在我们的一个全内存项目中,需要将一家大品牌店铺小千万的trade灌入到内存中,大家知道trade中一般会有订单来源,省市区 ,当把这些字段灌进去后,你会发现他们
    2020-06-24