繁体   English   中英

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

[英]How does changing the position of the BaseStream of a BinaryReader affect the current state of a BinaryWriter that uses the same BaseStream?

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

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

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

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

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

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

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

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

更新#1:基于我已经撤回的答案和评论,我认为我需要使我的困惑更加清楚。 BinaryWriterBinaryReader都具有BaseStream属性。 我认为它指向用于创建作者和读者的流对象。 我开始认为这只是两者唯一的工作对象。

我不想过多地考虑流对象,因此我仍然愿意接受多种类型的流作为源。

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

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

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

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

我想在这一点上我已经回答了这个问题。 现在,我需要查找有关使用流来执行自己头脑中的事情的信息。

我发现使用MemoryStream的Reader和Writer更新了基本流中的位置。 因此,如果不费力地复制和还原位置值,就无法读取仍在写入的流。 不建议。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM