我正在研究一个监视流(可能来自NetworkStream
(的解析器。当在源流上看到某些数据时,将创建一个新MemoryStream
,并将源中的相关数据写入其中。
然后我将用于解析的MemoryStream
传递给另一个类方法,该方法将MemoryStream
解析为Stream
。在此方法中,将创建一个BinaryReader
。当它去读取数据时,没有,因为BinaryReader
实际上位于数据的末尾。
BinaryReader 没有 Position
属性或Seek
方法,因此需要更改下划线BaseStream
位置。一旦位置改变,就可以解析流。
在这种情况下,我们不会添加其他数据,因此没有问题。但是我突然想到,如果出现类似的情况并且要写入其他数据,这可能不起作用,因为位置值在其背后发生了变化。
我对这里的含义有点模糊。
作者和读者是否使用BaseStream
及其位置的副本或允许损坏的原始对象?
这是否意味着我需要在创建编写器的同时创建读取器,以便两者都从同一位置开始,然后将读取器传递给方法而不是BaseStream
?我认为这可能是更好的做法。
二进制读取器和编写器是否维护自己的位置信息?我不是因为财产不在那里。如果不是,您可以在同一线程中同时使用它们吗?
更新#1:根据已经撤回的答案和评论,我认为我需要让我的困惑更清晰一点。BinaryWriter
和BinaryReader
都有BaseStream
。我认为它指向用于创建编写器和读取器的流对象。我开始认为它只是一个对两者都唯一的工人对象。
我不想对流对象做太多假设,以便我对多种类型的流作为源保持开放。
更新#2:现在运行一些测试代码后,我看到它们已连接。写入数据时,它会影响读取器的位置。我认为读者不会受到影响是有用的,这样它就可以从中断的地方继续阅读流的下一部分。我设想了这样的事情:
- 发生数据事件。该事件会导致编写器写入数据。
- 在某些时候,读取器会处理流中的某些数据。
- 发生另一个事件,导致写入更多数据。
- 它被附加到读者已经在处理的数据中。
- 阅读器完成其工作,包括新数据。
但是根据读取器和写入器之间的位置工作方式,这不是使用流的方式。
也许我的概念问题是因为我的BaseStream是一个MemoryStream,规则与NetworkStream不同。我试图将流源代码的实现细节排除在阅读类之外。
我想在这一点上我有问题的答案。现在我需要找到有关使用流来执行我脑海中的事情类型的信息。
我发现使用 MemoryStream the Reader 和 Writer 更新了基本流中的位置。因此,如果不处理仓位值的复制和恢复,就无法读取仍在写入的流。不推荐。
我重新设计了一些东西,以便我可以将整个事务写入 MemoryStream 并将其传递给另一个类。为下一个事务创建新的内存流。
基础流不是给定流的派生,它是实际流。