将数据从MemoryStream直接复制到BinaryWriter.BaseStream
本文关键字:复制 BinaryWriter BaseStream 数据 MemoryStream | 更新日期: 2023-09-27 18:20:29
我在MemoryStream
中有一堆数据,我想将所有数据写入BinaryWriter
。
幸运的是,现在所有流都有一个Stream.CopyTo(Stream)
方法,我可以从BinaryWriter.BaseStream
属性中获得目标流。
public void WriteTo(BinaryWriter writer)
{
this.memoryStream.CopyTo(writer.BaseStream);
}
我可以像这样安全地绕过编写器并将其直接复制到基本流吗?或者这会扰乱编写器的缓冲区、位置或其他什么吗?或者,您建议如何将Stream
复制到BinaryWriter
?
如果你不想破坏你在初始流中的数据,就不会这样做:
var myStreamInitially = new MemoryStream();
var myStreamClone = new MemoryStream();
myStreamInitially.CopyTo(myStreamClone);
var binaryWriteb = new BinaryWriter(myStreamClone);
如果您使用的是.NET 4+,那么CopyTo方法非常方便。
更新
这不是比更改baseStream的二进制流更安全吗:
void WriteToStreamInUnknownStatus(BinaryWriter binaryWriter)
{
var myStream = new MemoryStream();
try
{
binaryWriter.Write(myStream.ToArray());
}
catch
{ }
}
更新2
如果你尝试这样做,你会得到一个异常:"内存流是不可解释的"
static void Main(string[] args)
{
var binaryWrite = new BinaryWriter(new MemoryStream(new byte[] {1, 2, 3, 4}));
binaryWrite.Seek(3, SeekOrigin.Begin);
var position = binaryWrite.BaseStream.Position;
new MemoryStream(new byte[] {1, 2, 3, 4}).CopyTo(binaryWrite.BaseStream);
position = binaryWrite.BaseStream.Position;
}
因此,除了必须确保属性是线程安全的之外,您还需要知道内部流的类型。风险IMO.
您的建议是安全的,前提是:
- 您将在单线程上下文中使用它。要么没有其他线程,要么在调用此时对编写器具有独占锁定。。。以及
- 在直接写入
BaseStream
之前,您先在编写器上调用Flush
。写入程序可能缓冲了一些尚未写入流的数据
所以你修改后的代码是:
public void WriteTo(BinaryWriter writer)
{
writer.Flush();
this.memoryStream.CopyTo(writer.BaseStream);
}