You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

C#中MemoryStream写入文件内容不完整且尾部截断问题排查求助

问题原因与修复方案

这个截断问题的核心是StreamWriter的缓冲区没有被正确刷新,导致部分数据还留在内存缓冲区里,没能写入到你的MemoryStream中。

具体原因

StreamWriter默认会使用内部缓冲区来优化写入性能——当你调用WriteLine时,数据不会立刻全部写入底层的MemoryStream,而是先暂存到缓冲区里,只有当缓冲区满了或者你主动触发刷新/释放操作时,才会把缓冲区里的内容全部写入目标流。

你在WriteToStream方法里创建了StreamWriter,但既没有调用Flush()手动刷新缓冲区,也没有通过using语句自动释放StreamWriter(Dispose操作会自动触发Flush),所以最后一部分数据(包括被截断的"True"剩下的字符)还留在缓冲区里,根本没进到MemoryStream,自然复制到文件时就出现了缺失和截断。

修复方案

有两种简单的解决方式,推荐第一种:

方案一:用using包裹StreamWriter(推荐)

using语句会在代码块结束时自动释放StreamWriter,而释放时会自动刷新缓冲区,确保所有数据都写入底层流:

public static void WriteToStream(Stream stream) {
    Random rnd = new();
    using StreamWriter sw = new(stream); // using自动管理生命周期
    for (int i = 0; i < 100; i++) {
        sw.WriteLine(i);
        sw.WriteLine($"Passanger{i}");
        sw.WriteLine(rnd.Next(0, 2) == 1);
    }
    // 无需手动Flush,using结束时会自动完成
}

方案二:手动调用Flush()

如果你不想立刻释放StreamWriter,可以在写完所有数据后手动调用Flush(),强制把缓冲区里的内容写入MemoryStream:

public static void WriteToStream(Stream stream) {
    Random rnd = new();
    StreamWriter sw = new(stream);
    for (int i = 0; i < 100; i++) {
        sw.WriteLine(i);
        sw.WriteLine($"Passanger{i}");
        sw.WriteLine(rnd.Next(0, 2) == 1);
    }
    sw.Flush(); // 手动刷新缓冲区
    // 如果后续不再使用sw,建议调用sw.Dispose()释放资源
}

额外说明

你看到最后一行只剩"T",是因为"True"这个字符串被拆分到了缓冲区里——已经写入的是第一个字符"T",剩下的"rue"还留在缓冲区没被写入,所以文件里就只显示了半截内容。

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

火山引擎 最新活动