我需要将图像和小视频文件(大约5MB,小于10MB)发送到REST服务,我将编写。 我想知道我是否应该使用Byte []或Stream来完成这项任务。 在使用Byte []和Stream?
之间,传输文件大小的分界线是什么?答案 0 :(得分:11)
您愿意为交易提交的可用内存量是您唯一真正的约束。
如果您有一个5M文件,那么您需要将整个内容加载到RAM中,这将花费5M。
如果你流式传输,你可以使用更少的内存,通过从文件中读取小块到可重用的缓冲区并将这些块写入HTTP流。
答案 1 :(得分:7)
最终,你将以任何一种方式发送信息流。
如果您收到来自控件之外的其他来源的数据为大量byte[]
,那么您可以将其保存在该表单中以供处理,除非它对您不方便,并将其推入网络流下线。
如果您将其作为流接收,则无需将其转换为大量byte[]
只是为了将其推送到另一个流。使用4或8 kiB的缓冲区(4或8而不是4到8,因为在你可以利用的那些内存页的重合符中有一些小的优点)。
如果您是自己创建的,那么对于大多数情况来说,流更容易(包装在二进制文本或文本编写器中,并通过它完成)并且效率更高。
更一般地说,如果我看到一个超过8kiB的缓冲区被写入或从流中读取,那么我会注意到,如果事情看起来太慢,首先尝试改变。
答案 2 :(得分:2)
在字节数组或流中进行选择时的一般测试取决于您是否预先知道数据中有多少字节,以及该数字对于给定目的是否相当小。
例如,如果您正在处理本地计算机上可用的小图标文件(小于50KB)并且您知道文件大小,请使用字节数组。
相反,如果您正在处理电影文件,在那里难以将内容中的2GB内容放在内存中,更不用说不必要了,请使用流。
Streams最适合处理较大的数据集或数据,这些数据或数据的长度不知道。