我是一个带有内存流的二进制写入器,如果出现一个条件,我需要清除它:
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);
}
}
但问题是memorystream是空的。我已经尝试过再次创建一个新的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清除二进制文件?我需要将memorystream的最终内容写入文件。
谢谢!
答案 0 :(得分:1)
此代码通过内存流初始化log
对象,然后创建另一个内存流,其引用存储在memoryStream
中,但log
对象二进制文件具有其原始内存流,而不是新内存流记忆流。
您可以通过检查它们的HashCode来检查这一点。
答案 1 :(得分:1)
你的意思是你想写一个不同的MemoryStream
吗?您已将旧writer
的引用传递给Log
,因此Log
实例保留了引用。之后更改writer
变量将不会生效。你需要
writer
传递给它Log
方法,允许操纵对象保持的BinaryWriter
答案 2 :(得分:1)
第一个代码段不起作用,因为BinaryWriter仍在使用旧的MemoryStream引用。你不能说服它使用新的。
第二个代码段不起作用,因为您的Log类仍在使用旧的BinaryWriter引用。您可以通过添加更新“log”的方法来说服它使用新的。
或者你可以作弊并调用memoryStream.SetLength(0)强制它在开头重新开始。
请回顾一下使用MemoryStream进行日志记录的智慧。它的大小没有上限。大概是你正在寻找这种解决方法的原因。当你需要回放流时,完全抛弃所有并不是很好。 Murphy将确保在您需要日志信息以解决问题的确切时刻发生这种情况。 circular buffer没有这个问题。