Wri*_*ick 8 .net c# memorystream stream
哪一个更好:MemoryStream.WriteTo(Stream destinationStream)或者Stream.CopyTo(Stream destinationStream)??
我正在谈论没有Buffer的这两种方法的比较,因为我这样做:
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??
}
Run Code Online (Sandbox Code Playgroud)
这是我想要做的:
我写了一些实际工作正常的代码.
但是现在我正在优化代码以提高效率.
Han*_*ant 16
这是一个历史性的事故,有两种方法可以做同样的事情.MemoryStream总是有WriteTo()方法,Stream直到.NET 4才获得CopyTo()方法.
MemoryStream.WriteTo()版本如下所示:
public virtual void WriteTo(Stream stream)
{
// Exception throwing code elided...
stream.Write(this._buffer, this._origin, this._length - this._origin);
}
Run Code Online (Sandbox Code Playgroud)
Stream.CopyTo()实现如下:
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);
}
}
Run Code Online (Sandbox Code Playgroud)
Stream.CopyTo()更通用,适用于任何流.并帮助程序员摸索从NetworkStream复制数据.忘记关注Read()的返回值是一个非常常见的错误.但它当然会复制字节两次并分配临时buffer,MemoryStream不需要它,因为它可以直接从自己的缓冲区写入.所以你仍然喜欢WriteTo().注意到差异的可能性不大.
MemoryStream.WriteTo:将此内存流的全部内容写入另一个流.
Stream.CopyTo:从当前流中读取字节并将其写入目标流.复制从当前流中的当前位置开始.您需要回到0,才能复制整个源流.
所以我认为MemoryStream.WriteTo更适合这种情况
如果您使用Stream.CopyTo,则不需要首先将所有字节读入内存。然而:
File.Copy如果要将所有数据加载到内存中,您可以使用:
byte[] data = File.ReadAllBytes("input");
File.WriteAllBytes("output", data);
Run Code Online (Sandbox Code Playgroud)您应该有一个using输入和输出流的声明
如果您确实需要处理,因此不能使用File.Copy,则使用Stream.CopyTo将处理比将所有内容加载到内存中更大的文件。当然,您可能不需要这样做,或者您可能因其他原因需要将整个文件加载到内存中。
如果您有一个MemoryStream,我可能会使用MemoryStream.WriteTo而不是Stream.CopyTo,但您使用的可能不会有太大区别,除了您需要确保在使用时位于流的开头CopyTo。