什么时候用字节数组,什么时候用流?

Posted

技术标签:

【中文标题】什么时候用字节数组,什么时候用流?【英文标题】:When to use byte array, and when to use stream? 【发布时间】:2012-02-12 10:27:33 【问题描述】:

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

【问题讨论】:

【参考方案1】:

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

如果你有一个 5M 的文件,那么你需要将整个文件加载到 RAM 中,这将花费 5M。

如果您流式传输它,您可以使用更少的内存,方法是将文件中的小块读取到可重用缓冲区并将这些块写入 HTTP 流。

【讨论】:

【参考方案2】:

最终,无论哪种方式,您都将发送流。

如果您从您无法控制的其他来源接收到大量 byte[] 的数据,那么您最好将其保留为该格式以供您处理,除非对您造成不便,然后将其推送到网络流中下线。

如果您将其作为流接收,则将其转换为大量 byte[] 只是为了将其推送到另一个流是没有意义的。使用 4 或 8 kiB 的缓冲区(4 或 8 而不是 4 到 8,因为在内存页整数的一致性方面有一些小的优势,您不妨利用这些优势)。

如果您自己创建它,流在大多数情况下更容易(包装在二进制或文本编写器中,并通过它工作)并且效率更高。

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

【讨论】:

【参考方案3】:

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

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

相反,如果您正在处理一个电影文件,并且一次在内存中保留 2GB 的内容会很困难,更不用说不必要了,请使用流。

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

【讨论】:

以上是关于什么时候用字节数组,什么时候用流?的主要内容,如果未能解决你的问题,请参考以下文章

C#套接字字节数组

java和c#的字节数组转换问题

设计一个字节数组缓存类

Mysql字节数组存储

[C++11]_[初级]_[十六进制字符串转换为字节数组]

在C语言中定义二维数组long a[3][5],则数组占多少字节的存储空间?