我在MemoryStream
中有大量数据,我想将所有数据写入BinaryWriter
。
幸运的是,现在所有流都有Stream.CopyTo(Stream)
method,我可以从BinaryWriter.BaseStream
property获取目标流。
public void WriteTo(BinaryWriter writer)
{
this.memoryStream.CopyTo(writer.BaseStream);
}
我可以安全地绕过这样的编写器并将其直接复制到基本流中,还是会弄乱编写器的缓冲区,位置或其他东西?或者,您如何建议将Stream
复制到BinaryWriter
?
答案 0 :(得分:2)
如果您不想弄乱初始流中的数据,就不会有这样的工作:
var myStreamInitially = new MemoryStream();
var myStreamClone = new MemoryStream();
myStreamInitially.CopyTo(myStreamClone);
var binaryWriteb = new BinaryWriter(myStreamClone);
如果您使用的是.NET 4+,则CopyTo方法非常方便。
<强>更新强>
这不比更改baseStream底层的binaryStream更安全:
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带来风险。
答案 1 :(得分:2)
您提出的建议是安全的,但是:
Flush
之前,您在作者上致电BaseStream
。编写器可以缓存一些尚未写入流的数据。所以修改后的代码是:
public void WriteTo(BinaryWriter writer)
{
writer.Flush();
this.memoryStream.CopyTo(writer.BaseStream);
}