You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

写入MemoryStream后读取是否需将Position重置为0?

MemoryStream写入后写入磁盘,是否需要重置Position?

嘿,这个问题问得特别实用!先看你给出的代码示例:

using (var stream = new MemoryStream()) {
    thumbnail.Save(stream); // you get the idea
    stream.Position = 0; // <- is this needed?
    WriteStreamToDisk(stream);
}

你的疑问是:当通过方法向MemoryStream写入数据后,若要将该流写入磁盘,是否需要把stream.Position设置为0?流有没有独立的读/写指针?

答案很明确:必须要设置stream.Position = 0(或者用stream.Seek(0, SeekOrigin.Begin)),原因如下:

  • MemoryStream并没有独立的读、写指针,它只有一个共享的位置指针。当你调用thumbnail.Save(stream)写入数据时,这个指针会随着写入操作不断向后移动,直到写入完成后停在所有数据的末尾。
  • 如果这时候直接调用WriteStreamToDisk(stream),读取流的操作会从当前指针位置(也就是数据末尾)开始,自然读不到任何内容,最终写入磁盘的文件会是空的。

举个简单的例子:假设你往流里写入了500字节的图片数据,写完之后stream.Position的值就是500。这时候读取流的话,从索引500开始,后面没有数据了,所以读取结果是空的。只有把Position重置为0,读取操作才会从流的起始位置开始,把所有500字节的数据都读出来写入磁盘。

另外补充一点:有些方法会自动帮你处理指针位置,但Image.Save()显然不在此列——它只会负责把数据写入流,不会关心你之后要怎么读取这个流,所以重置指针的工作得自己来做。

内容的提问来源于stack exchange,提问作者Thomas

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 04:16:28