【问题标题】:Should I use Stream.Flush before Stream.CopyTo?我应该在 Stream.CopyTo 之前使用 Stream.Flush 吗?
【发布时间】:2015-07-12 03:07:16
【问题描述】:

我有 MemoryStream,我正在使用 StreamWriter 填充一些数据。 最后我想把它转储到不同的流(不总是文件)。

我应该在使用 Steram.CopyTo 方法之前调用 Stream.Flush 吗?

【问题讨论】:

  • 这个问题的原因是什么?你能详细说明你试图解决的问题吗?如果这是一个好奇的问题,那么不,您不必在对任一流使用 CopyTo 之前刷新当前数据。

标签: c# .net stream memorystream


【解决方案1】:

我应该在使用 Stream.CopyTo 方法之前调用 Stream.Flush 吗?

不,无需致电Flush。但是,您需要在MemoryStream 上将Position 重置为0。

CopyTo 文档说:

复制从当前流中的当前位置开始,复制操作完成后不会重置目标流的位置。

【讨论】:

    【解决方案2】:

    你永远不需要在内存流上调用Flush,因为这个操作什么都不做。如果您查看源代码,则实现是空的。您确实需要在写入后倒回流。

    但是,您需要刷新StreamWriter,以确保在开始复制之前将所有数据推送到内存流中。

    您可以将此模式与 StreamWriter 一起使用写入内存流以避免显式刷新:

    MemoryStream memStream = ...
    using (StreamWriter wr = new StreamWriter(memStream)) {
        ... // Do the writing
    }
    memStream.Position = 0; // Rewind
    // At this point `memStream` has all data pushed into it,
    // and is positioned at zero, so it's ready to be copied.
    

    【讨论】:

    • 谢谢。你在哪里查看 MemoryStream.Flush() 的源代码?
    • @Hooch 我在网上找到了反射源here。向下滚动或搜索查看代码(前 250 多行是 cmets,在反射源中丢失)。
    • 谢谢。这在这种情况下会派上用场。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-11-01
    • 1970-01-01
    • 2013-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多