如何将一个流的内容写入.net中的另一个流?
时间:2020-03-06 14:41:03 来源:igfitidea点击:
我经常遇到这样的问题:我有一个流满了数据,并且想将所有数据写入另一个流中。
那里的所有代码示例都使用字节数组形式的缓冲区。
有没有更优雅的方式呢?
如果不是,理想的缓冲区大小是多少。哪些因素构成了这一价值?
解决方案
关于理想的缓冲区大小:
"使用Read方法时,使用与流的内部缓冲区大小相同的缓冲区效率更高,其中内部缓冲区设置为所需的块大小,并且始终读取小于该块大小的缓冲区。如果在构造流时未指定内部缓冲区的大小,则其默认大小为4 KB(4096字节)。"
任何流读取过程都将使用Read(char buffer [],int index,count),这是此引用所引用的方法。
http://msdn.microsoft.com/zh-cn/library/9kstw824.aspx(在"备注"下)。
将FileStream中的数据读入通用Stream
可能会有一些指示要走
我不确定是否可以在.NET中直接将一个流传输到另一个流,但这是使用中间字节缓冲区执行此操作的方法。缓冲区的大小是任意的。最有效的大小将主要取决于我们要传输的数据量。
static void CopyStream(Stream input, Stream output){ byte[] buffer = new byte[0x1000]; int read; while ((read = input.Read(buffer, 0, buffer.Length)) > 0) output.Write(buffer, 0, read); }
我不知道有比使用缓冲区更优雅的方法。
但是缓冲区的大小会有所不同。还记得有关Vista的文件复制的问题吗?原因是(基本上)更改了缓冲区大小。更改将在此博客文章中进行说明。我们可以从该文章中了解主要因素。但是,这仅适用于文件复制。在应用程序中,我们可能会做很多内存副本,因此,在这种情况下,如.NET文档所建议的那样,4KB可能是最佳的缓冲区大小。
在.NET 4.0中,我们终于有了一个Stream.CopyTo方法!耶!
BufferedStream.CopyTo(Stream)