何时使用字节数组,何时使用流?

YoY*_*Myo 8 c# media service wcf

我需要将图像和小视频文件(大约5MB,小于10MB)发送到REST服务,我将编写.我想知道我是否应该使用Byte []或Stream来完成这项任务.在使用Byte []和Stream之间传输文件大小方面的分界线是什么?

Wil*_*ung 12

您愿意为事务提交的可用内存量是您唯一真正的约束.

如果您有一个5M文件,那么您需要将整个内容加载到RAM中,这将花费5M.

如果你流式传输,你可以使用更少的内存,通过从文件中读取小块到可重用缓冲区并将这些块写入HTTP流.


Jon*_*nna 7

最终,你将以任何一种方式发送流.

如果您收到来自控制之外的其他来源的数据byte[],那么您可以将其保存在该表单中以供处理,除非它对您不方便,并将其推送到网络流中.

如果你把它作为一个流接收,没有必要把它变成一个巨大的byte[]只是把它推到另一个流.使用4或8 kiB(4或8而不是4到8)的缓冲区,因为在你可以利用的那些内存页的重合数中有一些小的优点.

如果你自己创建它,那么对于大多数情况来说,流更容易(包装在二进制文件或文本编写器中,并通过它完成)以及更高效.

更一般地说,如果我看到一个超过8kiB的缓冲区被写入或从流中读取,那么我会注意到,如果事情看起来太慢,首先尝试改变.


Jas*_*erg 6

在字节数组或流之间进行选择时的一般测试取决于您是否预先知道数据中有多少字节,以及对于给定目的而言该数字是否相当小。

例如,如果您正在处理本地计算机上可用的小图标文件(小于 50KB)并且您知道文件大小,请使用字节数组。

相反,如果您正在处理的电影文件很难(更不用说没有必要)一次在内存中保留 2GB 的内容,请使用流。

流最适合处理较大的数据集或预先未知长度的数据。