为什么要分块写入 Stream?

2023-12-26

我想知道为什么这么多例子将字节数组读入卡盘中的流中,而不是一次全部读入……我知道这是一个软问题,但我很感兴趣。

我对硬件有一些了解,并且填充缓冲区可能非常依赖于大小,并且您不想再次写入缓冲区,直到它被刷新到需要去的任何地方等...但是使用.Net平台(和其他现代语言)我看到了两者的例子。那么什么时候使用哪个,什么时候使用,或者第二个是绝对不行的?

这是我的意思(代码):

var buffer = new byte[4096];

while (true)
{
    var read = this.InputStream.Read(buffer, 0, buffer.Length);

    if (read == 0)
        break;

    OutputStream.Write(buffer, 0, read);
}

而不是:

var buffer = new byte[InputStream.Length];

var read = this.InputStream.Read(buffer, 0, buffer.Length);

OutputStream.Write(buffer, 0, read);

我相信两者都是合法的?那么为什么要经历 while 循环的所有大惊小怪(无论你决定如何构造它)?

我在这里扮演魔鬼代言人,因为我想尽可能多地学习:)


在第一种情况下,您只需要 4kB 内存。在第二种情况下,您需要与输入流数据占用的内存一样多的内存。如果输入流是4GB,则需要4GB。

您认为文件复制操作需要 4GB RAM 会好吗?如果您要准备一个 20GB 的磁盘映像怎么办?

还有管道这个东西。您不经常在 Windows 上使用它们,但在其他操作系统上经常看到类似的情况。第二种情况等待所有数据被读取,然后才将它们写入输出。然而,有时建议尽快写入数据 - 第一种情况将在读取第一个 4kB 输入后立即开始写入输出流。想想服务网页:建议 Web 服务器尽快发送数据,以便客户端的 Web 浏览器开始渲染标题和内容的第一部分,而不是等待整个正文。

但是,如果您知道输入流不会大于 4kB,则两种情况是等效的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么要分块写入 Stream? 的相关文章

随机推荐

  • 安装 vmware 工具:无法识别 3.8.0-19-generic 内核文件的路径 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 所以我正在使用 Lubuntu 并使用 vmplayer 作为虚拟机运行 并且我正在尝试安装 vmware 工具 做完之后 vmware
  • CodeIgniter URI 中不允许使用句点?

    所以读完之后这个问题 https stackoverflow com questions 389169 best practices for api versioning关于 API 版本控制 我决定为所有路由添加版本号前缀 http lo
  • XSLT 分割输出文件 - muenchian 分组

    我有一个 XSLT 文件 以便转换大量数据 我想添加一个 拆分 功能 无论是作为链接的 XSLT 还是在当前的 XSLT 中 它可以创建多个输出文件 以便将文件的大小限制在某个阈值以下 假设输入 XML 如下
  • Admob 用户消息平台的强制同意

    我从已弃用的 GDPR 同意库切换到新的用户消息传递平台 并使用了中所述的代码文档 https developers google com admob ump android quick start 我注意到当用户点击管理选项 then 确
  • 如何清除 SFSafariViewController 凭据?

    我在 Swift 2 中使用 SFSafariViewController 在带有 ios 9 1 13B143 的 iPad Air 2 上显示网页 每个网页都需要用户的凭据 但是 当用户按下注销按钮时 我需要清除这些凭据 我尝试过使用以
  • ruby on Rails 中的 url 编码等效项

    Ruby on Rails 2 3 5 中是否有与 PHP 的 urlencode 等效的代码 它对要在 URL 的查询部分中使用的字符串进行编码 我用谷歌搜索了它 但所有答案似乎都可以追溯到 2006 年之前 而且似乎有日期 这就是我发现
  • 在 Mac 上安装适用于 Python 的 Gtk 3

    我已经使用 homebrew 安装了 python gtk3 但它打印 警告 gtk 3 3 14 6 已安装 但是当我尝试在 python 中导入它时 from gi repository import Gtk 它给出了错误 导入错误 没
  • WebView 文本大小

    有时 当我加载页面 没有静态内容 动态构建 时 我看到字体太小1 http s8 postimage org 7akrcd8wl webview1 png 如果我重新加载 我会正确看到它2 http s7 postimage org cp6
  • 如何按照我们设置的顺序从本地存储中检索数据

    我正在通过循环遍历顶部菜单 对象数组 来读取 json 文件并将项目取出并将其存储到本地存储中 一切正常 甚至数据也存储在本地存储中 但我的问题是它按排序顺序将数据存储在 localStorage 中 这可能是其默认行为 但我不需要按排序顺
  • Python 访问字典列表中的字典

    您好 我有下面的字典 它有一个带有列表的值 列表内有一个字典 有没有办法使用键而不是列表索引来调用列表内的字典值 列表内的字典可能会有所不同 因此索引值可能并不总是提供正确的键值对 但如果我能够使用密钥 我总能获得正确的值 mylist m
  • 请求的资源上不存在“Access-Control-Allow-Origin”标头。与 github 站点

    http kingdiepie github io testing html http kingdiepie github io testing html XMLHttpRequest 无法加载https docs google com s
  • 在 PostgreSQL 和 Ruby on Rails 中使用间隔

    我想从 Rails 应用程序将持续时间 2 天 5 年 保存为 PostgreSQL 中的间隔 uration min 和uration max 都是 2 天 或 5 年 之类的值 因此它们各自都是一个间隔 def change creat
  • 如何防止控件改变Z顺序?

    我在 Net 中有用户控件 我在 WndProc 中使用命中测试 以允许在运行时使用鼠标调整其大小 问题是 命中测试成功后 按下鼠标 拖动以调整大小 释放鼠标 控件会按 Z 顺序向上跳跃并破坏其在窗体中的位置 我需要命中测试 因为它是一个非
  • 在 Jupyter 笔记本中使用 pandas 导入 csv 文件时出现 FileNotFoundError

    import pandas as pd df pd read csv home josepm Documents test ver2 csv FileNotFoundError Traceback most recent call last
  • 如何在javascript中检查日期是否在本周?

    我有这个日期 2016 04 23T11 45 00Z 我想在本周检查这个日期吗 Thanks 日期很难 我总是建议使用专用于日期处理的库 因为它可以减少代码中出现错误的机会 MomentJS http momentjs com 是一个很好
  • Notepad++ 将打开文档中的两行替换为其他 (10) 行

    我想用 Notepad 中的其他行替换两行 主要问题是我无法复制所有应该替换的行 如果我将所有行粘贴到 替换为 输入字段中 则只会将第一行插入该字段中 看来换行符没有正确复制 选择应插入 查找内容 字段中的行 带有换行符 非常容易 因为我可
  • 子子域上的通配符 SSL [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我们有一个通配符 SSL 证书 domain example 并拥有一个网站sub1 sub2 domain example macOS 上的 Saf
  • 加密云中的 HBase 静态数据

    我对 HBase 还很陌生 并被分配了一项将我们的基础设施迁移到云的任务 我们的 HBase 数据包含一些客户信息 因此需要在静态时进行加密 我已经在读这个了 静态数据的透明加密 http hbase apache org book ch0
  • Scrapy,start_url 限制

    我想知道是否有数量限制start urls我可以分配给我的蜘蛛吗 据我搜索 似乎没有关于列表限制的文档 目前我已经设置了我的蜘蛛 以便列表start urls从 csv 文件中读取 网址数量约为 1 000 000 个 本身没有限制 但您可
  • 为什么要分块写入 Stream?

    我想知道为什么这么多例子将字节数组读入卡盘中的流中 而不是一次全部读入 我知道这是一个软问题 但我很感兴趣 我对硬件有一些了解 并且填充缓冲区可能非常依赖于大小 并且您不想再次写入缓冲区 直到它被刷新到需要去的任何地方等 但是使用 Net平