【问题标题】:Clear binarywriter with memorystream使用内存流清除二进制写入器
【发布时间】:2013-12-01 14:11:33
【问题描述】:

我有一个带有内存流的二进制写入器,如果发生一种情况,我需要清除它:

public void Execute() {
    MemoryStream memoryStream = new MemoryStream();
    BinaryWriter writer = new BinaryWriter(memoryStream);
    Log log = new Log(writer);
    log.Write("OK1");
    ...

    // If condition
    memoryStream = new MemoryStream();
    ...
    log.Write("OK2");
    ...
}

public class Log {

    private BinaryWriter log;

    public Log(BinaryWriter bw)
    {
        log = bw;
    }

    public void write(string msg)
    {
        log.Write(msg);
    }
}

但问题是内存流是空的。我已经尝试再次创建一个新的 BinaryWriter:

public void Execute() {
    MemoryStream memoryStream = new MemoryStream();
    BinaryWriter writer = new BinaryWriter(memoryStream);
    Log log = new Log(writer);
    log.Write("OK1");
    ...

    // If condition
    memoryStream = new MemoryStream();
    writer = new BinaryWriter(memoryStream);
    ...
    log.Write("OK2");
    ...
}

public class Log {

    private BinaryWriter log;

    public Log(BinaryWriter bw)
    {
        log = bw;
    }

    public void write(string msg)
    {
        log.Write(msg);
    }
}

但是 BinaryWriter 和 MemoryStream 都是空的。

如何使用 memorystream 清除 binarywriter?我需要将内存流的最终内容写入文件。

谢谢!

【问题讨论】:

  • 您在 recordStream 上创建二进制写入器,而不是在 memoryStream 上。
  • 对不起,我重命名了这篇文章中的变量以使其更清晰。我已经在代码中修复了它。我认为将内存流识别到 MemorySteam 更容易。在我的代码中只有一个 MemoryStream 和一个 BinaryWriter,所以其他引用没有问题 :)

标签: c# c#-4.0 memorystream binarywriter


【解决方案1】:

你的意思是你想写信给另一个MemoryStream?您已将旧 writer 的引用传递给 Log,因此 Log 实例包含该引用。之后更改 writer 变量不会生效。你需要

  1. 创建一个新日志并将新的writer 传递给它
  2. 公开Log 的方法以允许从外部操作对象保存的BinaryWriter

【讨论】:

  • 是的,你是对的,当然。在创建新的 BinaryWriter 和 MemoryStream 之后,我创建了一个新的 Log 对象(尽管我可以在 Log 中创建一个名为 reset 的新方法,以 BinaryWriter 作为参数...)。
【解决方案2】:

此代码通过内存流初始化log 对象,然后创建另一个内存流,其引用存储在memoryStream 中,但log 对象二进制写入器具有其原始内存流,而不是新的内存流。 您可以通过检查它们的 HashCode 来检查这一点。

【讨论】:

    【解决方案3】:

    第一个 sn-p 不起作用,因为 BinaryWriter 仍在使用您的旧 MemoryStream 引用。你无法说服它使用新的。

    第二个 sn-p 不起作用,因为您的 Log 类仍在使用旧的 BinaryWriter 引用。您可以通过添加更新“日志”的方法来说服它使用新的。

    或者你可以作弊并调用 memoryStream.SetLength(0) 来强制它从头开始。

    请查看使用 MemoryStream 进行日志记录的智慧。它的大小没有上限。大概是您正在寻找此解决方法的原因。当您需要倒带流时,完全扔掉所有东西并不漂亮。 Murphy 将确保在您需要日志中的信息来解决问题的确切时间发生这种情况。 circular buffer 没有这个问题。

    【讨论】:

    • 这不是普通的日志。我已经把它放到了这篇文章中。在我的项目中,我序列化了整个 Microsoft 类,因此需要 BinaryWriter。但你的答案是正确的:)
    猜你喜欢
    • 2011-02-17
    • 2013-12-27
    • 1970-01-01
    • 2020-11-10
    • 1970-01-01
    • 1970-01-01
    • 2010-12-06
    • 1970-01-01
    • 2023-03-13
    相关资源
    最近更新 更多