0

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

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 都是空的。

如何使用内存流清除二进制写入器?我需要将内存流的最终内容写入文件。

谢谢!

4

3 回答 3

1

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

于 2013-12-01T14:33:02.450 回答
1

你的意思是你想写一个不同的MemoryStream?您已将 old 的引用传递writer给 the ,Log因此Log实例保存了该引用。之后更改writer变量不会生效。你需要要么

  1. 创建一个新的日志并将新的传递writer给它
  2. 公开一种方法,Log以允许BinaryWriter从外部对对象保存的内容进行操作
于 2013-12-01T14:34:57.187 回答
1

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

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

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

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

于 2013-12-01T14:41:25.157 回答