写入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
相关产品推荐
相关产品推荐

