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