0

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

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

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

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

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

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

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

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

更新#1:基于已被撤回的答案和评论,我认为我需要让我的困惑更清楚一点。和中都有一个BaseStream属性。我认为它指向用于创建写入器和读取器的流对象。我开始认为这只是两者独有的工作对象。BinaryWriterBinaryReader

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

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

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

但是基于位置在读者和作者之间的工作方式,这不是使用流的方式。

也许我的概念问题是因为我的 BaseStream 是 MemoryStream 并且规则与 NetworkStream 不同。我试图将流源的实现细节保留在阅读类之外。

我想此时我已经有了问题的答案。现在我需要找到有关使用流来做我脑海中的那种事情的信息。

4

1 回答 1

0

我发现使用 MemoryStream 时,Reader 和 Writer 更新了基本流中的位置。因此,如果不进行位置值的复制和恢复,您将无法读取仍在写入的流。不建议。

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

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

于 2013-07-05T00:10:02.547 回答