【问题标题】:Can't create MemoryStream无法创建 MemoryStream
【发布时间】:2013-04-22 05:37:29
【问题描述】:

有什么理由为什么这段代码不应该产生一个包含 Slappy 这个词的内存流?

    private MemoryStream StringBuilderToMemoryStream(StringBuilder source)
    {
        MemoryStream memoryStream = new MemoryStream();
        StreamWriter streamWriter = new StreamWriter(memoryStream);
        streamWriter.Write("slappy");
        return memoryStream;
    }

即使我说streamWriter.Write(source.toString()); 它也失败了。

有趣的是,它适用于调用此例程的方法之一,但不适用于其他任何方法。

我调用它们的顺序也没有区别。

但无论如何,即使我调用上述方法,从有效的方法中,输出仍然是一个空的 MemoryStream。

有什么想法吗?

【问题讨论】:

    标签: c# memorystream


    【解决方案1】:

    您不会刷新流写入器,因此单词永远不会被写入内存流。

    在调用streamWriter.Write之后添加以下内容:

    streamWriter.Flush();
    

    此外,如果您想稍后从内存流中读取该单词,请确保重置其位置,因为在写入之后它位于单词 slappy 之后:

    memoryStream.Position = 0;
    

    【讨论】:

    • 我们也可以将AutoFlush设置为true
    • +1。旁注:最好返回new MemoryStream(memoryStream.ToArray())(或基于与原始缓冲区相同的缓冲区)-正确处理streamWriter也会处理memoryStream...
    • 太棒了。有什么理由为什么当我有一个 5k 文件时,它会写出 4k 而不是最后的 1k。该行为是在使用刷新之前。我有一个自动刷新的临界点吗?
    • AutoFlush 的文档只是声明了以下内容:“当 AutoFlush 设置为 false 时,StreamWriter 将进行有限的缓冲”。在您的情况下,这个“有限数量”看起来是 1k。因此,每次内部缓冲区中有更多数据时,它都会将其刷新并将其写入流中,从而产生您所见证的效果
    • 太棒了。谢谢。尽可能标记已回答。
    【解决方案2】:

    如果您不想调用streamWriter.Flush();,您可以在创建 StreamWriter 时设置它的 AutoFlush-Property。

    MemoryStream memoryStream = new MemoryStream();
    StreamWriter streamWriter = new StreamWriter(memoryStream)
       {
          AutoFlush = true
       }
    

    【讨论】:

    • 是的,我也明白了。使用此解决方案的手动选项,因为它更有意义。 +1,谢谢。
    猜你喜欢
    • 1970-01-01
    • 2016-02-02
    • 1970-01-01
    • 1970-01-01
    • 2023-03-29
    • 2019-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多