首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >MemoryStream.WriteTo(Stream destinationStream)与Stream.CopyTo(Stream destinationStream)

MemoryStream.WriteTo(Stream destinationStream)与Stream.CopyTo(Stream destinationStream)
EN

Stack Overflow用户
提问于 2012-05-19 10:42:05
回答 6查看 17.1K关注 0票数 9

哪个更好:MemoryStream.WriteTo(Stream destinationStream)还是Stream.CopyTo(Stream destinationStream)??

我指的是这两种没有缓冲区的方法的比较,我就是这样做的:

代码语言:javascript
运行
复制
Stream str = File.Open("SomeFile.file");
MemoryStream mstr = new MemoryStream(File.ReadAllBytes("SomeFile.file"));

using(var Ms = File.Create("NewFile.file", 8 * 1024))
{
    str.CopyTo(Ms) or mstr.WriteTo(Ms);// Which one will be better??
}

更新

以下是我想做的事:

Stream

  • Extract

  • 打开文件说"X“类型文件

  • 解析内容

  • 从这里我得到了一堆新的流3~4个文件

  • 分析了一个文件H 114保存其他流到Files
  • Editing all Files
  • Generate a new "X”类型文件
  • Generate>H 219F 220

我已经编写了每一段代码,这些代码实际上是正确工作的。

但现在我正在优化代码,使之成为最有效的代码。

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2012-05-19 13:14:15

有两种方法来做同样的事情,这是一次历史性的意外。MemoryStream总是有WriteTo()方法,Stream直到.NET 4才获得CopyTo()方法。

MemoryStream.WriteTo()版本如下所示:

代码语言:javascript
运行
复制
public virtual void WriteTo(Stream stream)
{
    // Exception throwing code elided...
    stream.Write(this._buffer, this._origin, this._length - this._origin);
}

Stream.CopyTo()实现如下:

代码语言:javascript
运行
复制
private void InternalCopyTo(Stream destination, int bufferSize)
{
    int num;
    byte[] buffer = new byte[bufferSize];
    while ((num = this.Read(buffer, 0, buffer.Length)) != 0)
    {
        destination.Write(buffer, 0, num);
    }
}

Stream.CopyTo()更通用,它适用于任何流。并帮助那些摸索从NetworkStream复制数据的程序员。忘记注意Read()的返回值是一个非常常见的错误。但是,它当然会两次复制字节并分配临时的buffer,MemoryStream不需要它,因为它可以直接从自己的缓冲区写入。所以您仍然更喜欢WriteTo()。注意到这种差异的可能性不大。

票数 17
EN

Stack Overflow用户

发布于 2012-05-19 10:51:45

MemoryStream.WriteTo:将这个内存流的全部内容写入另一个流。

Stream.CopyTo:从当前流读取字节并将它们写入目标流。复制从当前流中的当前位置开始。您需要寻找返回到0,以获得整个源流复制。

所以我认为MemoryStream.WriteTo在这种情况下更好的选择

票数 6
EN

Stack Overflow用户

发布于 2012-05-19 10:53:58

如果使用Stream.CopyTo,则不需要首先将所有字节读入内存。然而:

如果您只使用File.Copy

  • If,那么要将所有数据加载到内存中,只需使用:

byte[] data = File.ReadAllBytes(" input ");File.WriteAllBytes(" output ",data);

  • --输入流和输出流

应该有一个using语句

如果您真的需要处理(所以不能使用File.Copy ),那么使用Stream.CopyTo将处理更大的文件,而不是将所有内容加载到内存中。当然,您可能不需要这样做,或者由于其他原因需要将整个文件加载到内存中。

如果您有一个MemoryStream,我可能会使用MemoryStream.WriteTo而不是Stream.CopyTo,但是它可能不会对您使用的东西产生太大影响,只是您需要确保在使用CopyTo时处于流的起始位置。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10664458

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档