如何将一个流的内容写入.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)