如何更改BinaryReader的BaseStream的位置会影响使用相同BaseStream的BinaryWriter的当前状态?

时间:2013-06-15 14:15:40

标签: c# stream binaryreader binarywriter

我正在研究一个监视流的解析器(可能来自NetworkStream)。当在源流上看到某些数据时,会创建一个新的MemoryStream,并将来自源的相关数据写入其中。

然后我将MemoryStream传递给另一个将MemoryStream解析为Stream的类方法。在此方法中,创建了BinaryReader。当它去读取数据时没有,因为BinaryReader实际上是在数据的末尾。

BinaryReader没有Position属性或Seek方法,因此需要更改下划线BaseStream位置。一旦更改了位置,就可以解析流。

在这种情况下,我们不会添加其他数据,因此没有问题。但是我想到,如果类似的情况到来并且其他数据将被写入,这可能不起作用,因为位置值在其背后被改变了。

我对这里的含义有点模糊。

作者和读者是否使用BaseStream及其位置或原始对象的副本来处理腐败?

这是否意味着我需要在创建编写器的同时创建阅读器,以便两者从同一点开始然后将读者传递给方法而不是BaseStream?我认为这可能是一种更好的做法。

BinaryReader和Writer是否保留自己的位置信息?我不是因为财产不在那里。如果没有,你可以在同一个线程中同时使用它们吗?

更新#1:根据已经撤回的答案和评论,我想我需要让我的混淆更加清晰。 BaseStreamBinaryWriter都有BinaryReader个属性。我认为它指向用于创建编写器和读取器的流对象。我开始认为它只是一个工作对象,两者都是独一无二的。

我不想对流对象有太多假设,因此我仍然对多种类型的流作为源开放。

更新#2:现在运行一些测试代码后,我发现它们已连接。写入数据时会影响阅读器的位置。我本来认为有用的是读者不受影响,以便它可以从中断的地方继续读取,阅读流的下一部分。 我设想了这样的事情:

  • 发生数据事件。该事件导致数据由作者写入。
  • 在某些时候,读者会处理流中的一些数据。
  • 发生了另一个事件,导致写入更多数据。
  • 它附加到读者已经在处理的数据上。
  • 读者完成其工作,包括新数据。

但根据位置在读写器之间的工作方式,这不是流的使用方式,。

也许我的构思问题是因为我的BaseStream是一个MemoryStream,规则与NetworkStream的规则不同。我试图将流源的实现细节保留在阅读课程之外。

我想在这一点上我得到了问题的答案。现在我需要找到有关使用流来处理我脑子里的事情的信息。

1 个答案:

答案 0 :(得分:0)

我发现使用MemoryStream的Reader和Writer更新了基本流中的位置。因此,您无法在不复制和恢复位置值的情况下读取仍在编写的流。不推荐。

我重写了一些事情,以便我可以将整个事务写入MemoryStream,将其传递给另一个类。为下一个事务创建一个新的MemoryStream。

基本流不是给定流的派生,而是实际流。