如何在.net中将一个流的内容写入另一个流?

Tho*_*ker 41 .net stream

我经常遇到这样的问题:我有一个数据流,并希望将其中的所有内容写入另一个流.

所有代码示例都使用字节数组形式的缓冲区.

有更优雅的方式吗?

如果不是,那么缓冲区的理想大小是多少.哪些因素构成了这个价值?

Tho*_*ker 70

在.NET 4.0中,我们终于得到了一个Stream.CopyTo方法!好极了!

  • 这正是它! (4认同)
  • 我反编译成Stream.CopyTo方法,它调用"this.InternalCopyTo(destination,81920);" 整数值是缓冲区大小.看起来像疯狂的缓冲区大小相比大多数缓冲技术似乎采用的标准4k.任何人都可以评论这个吗? (2认同)
  • 看起来这个数字只是试图避免使用大对象堆,这将在该数量的略微偏北. (2认同)

cor*_*ore 16

关于理想的缓冲区大小:

"当使用Read方法时,使用与流的内部缓冲区大小相同的缓冲区更为有效,其中内部缓冲区设置为所需的块大小,并始终读取小于块大小.如果在构造流时未指定内部缓冲区的大小,则其默认大小为4千字节(4096字节)."

任何流读取过程都将使用Read(char buffer [],int index,count),这是此引用所引用的方法.

http://msdn.microsoft.com/en-us/library/9kstw824.aspx(在"备注"下).


Bil*_*ard 7

我不确定你是否可以在.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);
}
Run Code Online (Sandbox Code Playgroud)


小智 5

BufferedStream.CopyTo(流)