当前位置: 首页 > 知识库问答 >
问题:

是否可以获取闭合内存流的长度?

陆子默
2023-03-14

我正在尝试将GZipStream与MemoryStream一起使用。我写入所需的所有字节,然后关闭gzip流,这样之后我需要从内存流中获取压缩的缓冲区,而无需分配额外内存(方法ToArray返回所需的字节数组,但它创建新的字节数组,然后将缓冲区中的所有字节复制到新数组)。据我所知,我只能使用GetBuffer()返回整个缓冲区,所以在这种情况下,我还有另一个问题:缓冲区末尾的所有零字节是否都不属于压缩数据?换句话说,我可以使用GetBuffer并假设压缩的缓冲区以最后一个非零字节结束吗?

此外,在许多情况下,我可以在关闭GZip流之前使用MemoryStream的长度,在关闭GZip流之后只向其添加10,这对所有情况都适用吗?

共有1个答案

曾涵育
2023-03-14

GZipStream的构造函数有一个带有leveopen参数的重载。

因此,当您需要在GZip关闭(并隐式刷新)后访问MemoryStream时,将其传递给true。

using (var ms = new MemoryStream())
{
    using (var gz = new GZipStream(ms, CompressionMode.Compress, leaveOpen: true))
    {
       // ... write to gz
    }
    Console.WriteLine(ms.Length);  // this is the final and accurate length
}

这仍然存在GetArray()与getBuiffer()问题,但现在您可以使用具有准确长度的缓冲区。

 类似资料:
  • 问题内容: 我正在从另一个来源接收ZipInputStream,并且需要将第一项的InputStream提供给另一个来源。 我希望能够在不将临时文件保存在设备上的情况下执行此操作,但是,我知道获取单个条目的InputStream的唯一方法是通过ZipFile.getInputStream(entry),并且因为我有一个ZipInputStream而不是ZipFile , 这是不可能的。 所以我最好

  • 问题内容: 有没有一种方法可以检查nodestore的firestore中是否存在子集合? 目前,我正在使用文档,但是我需要检查文档中是否存在子类以便写入一些数据。 问题答案: 就在这里。您可以使用docs.length来知道子集合是否存在。 我制作了一个样本来指导您,希望对您有所帮助。

  • 问题内容: 我正在使用Elasticsearch v2.3.0。假设我有一个映射索引: 所以,从文本复制到文本因。如果你查询信息,然后从纯数据显示在现场,因为不被修改。如果要获取所有文本,则应汇总客户端上的所有字段。如果有许多子字段,这可能会带来不便。 是否有一个魔术查询,该查询允许获取复制了所有文本的字段? 问题答案: 在字段集的映射中, 您应该能够使用字段来获取它 范例 : 结果

  • 问题内容: 我用np.save()保存了几个numpy数组,并将它们放在一起非常大。 是否可以将它们全部加载为内存映射文件,然后对它们进行串联和切片,而无需将任何内容都加载到内存中? 问题答案: 使用显然将数组加载到内存中。为避免这种情况,您可以轻松地在新文件中创建一个thrid数组,并从要连接的数组中读取值。以更有效的方式,您还可以将新阵列追加到磁盘上已存在的文件中。 在任何情况下,您都必须为数

  • 问题内容: 我想抢先获取要在中加载的网页的HTML代码,使用正则表达式解析它,并仅显示所需的HTML代码,同时让该网页仍然认为它已加载了所有内容。 有什么方法可以通过或类似方法来做到这一点? 编辑:我尝试过此: 该接口永远不会被调用 问题答案: 不得不使用HttpClient。无需Cookie,只需解析html:

  • 问题内容: 我不知道它是否相关,但是我正在将Java与azure-storage-android-0.2.0.aar一起用于上传。 我可以将文件上传到Microsoft Azure Blob存储 其中n是从文件派生的inputStream的长度。 这是我的问题:我想直接流式传输(例如,从摄像机流式传输),这显然是不可能的,因为Azure要求上传的长度参数,而仍在流式传输时未知。 为什么我需要指定长