哪个更好:MemoryStream.WriteTo(Stream destinationStream)还是Stream.CopyTo(Stream destinationStream)??
我指的是这两种没有缓冲区的方法的比较,我就是这样做的:
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
H 114保存其他流到FilesF 220我已经编写了每一段代码,这些代码实际上是正确工作的。
但现在我正在优化代码,使之成为最有效的代码。
发布于 2012-05-19 13:14:15
有两种方法来做同样的事情,这是一次历史性的意外。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);
}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);
}
}Stream.CopyTo()更通用,它适用于任何流。并帮助那些摸索从NetworkStream复制数据的程序员。忘记注意Read()的返回值是一个非常常见的错误。但是,它当然会两次复制字节并分配临时的buffer,MemoryStream不需要它,因为它可以直接从自己的缓冲区写入。所以您仍然更喜欢WriteTo()。注意到这种差异的可能性不大。
发布于 2012-05-19 10:51:45
MemoryStream.WriteTo:将这个内存流的全部内容写入另一个流。
Stream.CopyTo:从当前流读取字节并将它们写入目标流。复制从当前流中的当前位置开始。您需要寻找返回到0,以获得整个源流复制。
所以我认为MemoryStream.WriteTo在这种情况下更好的选择
发布于 2012-05-19 10:53:58
如果使用Stream.CopyTo,则不需要首先将所有字节读入内存。然而:
如果您只使用File.Copy
byte[] data = File.ReadAllBytes(" input ");File.WriteAllBytes(" output ",data);
应该有一个using语句
如果您真的需要处理(所以不能使用File.Copy ),那么使用Stream.CopyTo将处理更大的文件,而不是将所有内容加载到内存中。当然,您可能不需要这样做,或者由于其他原因需要将整个文件加载到内存中。
如果您有一个MemoryStream,我可能会使用MemoryStream.WriteTo而不是Stream.CopyTo,但是它可能不会对您使用的东西产生太大影响,只是您需要确保在使用CopyTo时处于流的起始位置。
https://stackoverflow.com/questions/10664458
复制相似问题