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

12

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

3个回答

16

你愿意为事务提交的可用内存量是唯一真正的限制。

如果你有一个5MB的文件,那么你需要将整个文件加载到内存中,这将消耗5MB的内存。

如果你使用流来处理,可以通过从文件中读取小块并将这些块写入HTTP流的可重复缓冲区中,使用更少的内存。


9
最终,你将发送一个流。
如果你以一个你无法控制的大量字节(byte[])形式从另一个来源接收数据,则在处理过程中除非这对你不方便,否则最好保留它在该形式,并让其下行被推入网络流。
如果你将其作为流接收,则没有必要将其转换为巨大的byte[],然后再推到另一个流中。使用4或8 kiB的缓冲区(4或8而不是4到8,因为使用这些数字可以在内存页的整数倍上获得一些微小优势,因此您可以充分利用)。
如果你自己创建它,则流在大多数情况下都更容易(将其包装在二进制或文本编写器中,并通过它进行工作),同时效率更高。
更一般地说,如果我看到正在写入或读取流的缓冲区超过8kiB,则会注意到这是需要尝试更改的第一件事,如果速度似乎太慢。

6

在选择字节数组或流时,通常的测试取决于你是否预先知道数据中有多少字节以及对于给定目的来说这个数字是否相对较小。

例如,如果你正在处理一个小图标文件(小于50KB)并且知道文件大小,则应该选择字节数组。

相反,如果你正在处理一个电影文件,在同一时间将2GB内容存储在内存中既困难又无必要时,应该使用流。

流最适合处理更大量的数据或者长度未在一开始就知道的数据。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接