更改 BinaryReader 的 BaseStream 的位置如何影响使用相同 BaseStream 的 Binary



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

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

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

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

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

作者和读者是否使用BaseStream及其位置的副本或允许损坏的原始对象?

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

二进制读取器和编写器是否维护自己的位置信息?我不是因为财产不在那里。如果不是,您可以在同一线程中同时使用它们吗?

更新#1:根据已经撤回的答案和评论,我认为我需要让我的困惑更清晰一点。BinaryWriterBinaryReader都有BaseStream。我认为它指向用于创建编写器和读取器的流对象。我开始认为它只是一个对两者都唯一的工人对象。

我不想对流对象做太多假设,以便我对多种类型的流作为源保持开放。

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

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

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

也许我的概念问题是因为我的BaseStream是一个MemoryStream,规则与NetworkStream不同。我试图将流源代码的实现细节排除在阅读类之外。

我想在这一点上我有问题的答案。现在我需要找到有关使用流来执行我脑海中的事情类型的信息。

我发现使用 MemoryStream the Reader 和 Writer 更新了基本流中的位置。因此,如果不处理仓位值的复制和恢复,就无法读取仍在写入的流。不推荐。

我重新设计了一些东西,以便我可以将整个事务写入 MemoryStream 并将其传递给另一个类。为下一个事务创建新的内存流。

基础流不是给定流的派生,它是实际流。

相关内容

  • 没有找到相关文章

最新更新