何时使用字节数组,何时使用流
本文关键字:何时使 字节数 字节 数组 | 更新日期: 2023-09-27 18:20:28
我需要将图像和小视频文件(大约5MB,小于10MB)发送到REST服务,我将编写该服务。我想知道是否应该使用Byte[]或Stream来完成此任务。使用Byte[]和Stream之间的传输文件大小的分界线是什么?
您愿意提交给事务的可用内存量是您唯一真正的约束。
如果你有一个5M的文件,那么你需要将整个文件加载到RAM中,这将花费5M。
如果您对其进行流式传输,您可以使用更少的内存,方法是将文件中的小块读取到可重用的缓冲区中,然后将这些块写入HTTP流。
最终,您将以任何一种方式发送流。
如果你从你控制之外的另一个来源接收到数据,称为海量byte[]
,那么除非你不方便,否则你最好保持这种形式进行处理,并让它被推送到网络流中。
如果你把它作为一个流来接收,那么把它变成一个巨大的byte[]
只是为了把它推到另一个流是没有意义的。使用4或8 kiB的缓冲区(4或8,而不是4到8,因为在内存页重合的总数中有一些小优势,你也可以利用这些优势)。
如果你自己创建它,那么在大多数情况下,流既更容易(封装在二进制或文本编写器中,并完成它),也更高效。
更普遍地说,如果我看到一个大于8kiB的缓冲区正在写入流或从流中读取,那么我会注意到,如果速度太慢,首先要尝试更改。
在字节数组或流之间进行选择时的一般测试取决于您是否预先知道数据中有多少字节,以及对于给定的目的,这个数字是否相当小。
例如,如果您正在处理本地机器上可用的一个小图标文件(小于50KB),并且您知道文件大小,请使用字节数组。
相反,如果您使用的电影文件很难同时在内存中保留2GB的内容,更不用说不必要了,请使用流。
流最适合处理较大的数据集或长度未知的数据。