[英]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:基于我已经撤回的答案和评论,我认为我需要使我的困惑更加清楚。 BinaryWriter
和BinaryReader
都具有BaseStream
属性。 我认为它指向用于创建作者和读者的流对象。 我开始认为这只是两者唯一的工作对象。
我不想过多地考虑流对象,因此我仍然愿意接受多种类型的流作为源。
更新#2:现在,运行一些测试代码后,我看到它们已连接。 写入数据时会影响读取器的位置。 我本以为有用的是,读者将保持不受影响,以便它可以从中断处继续学习,阅读流的下一部分。 我设想这样的事情:
但是基于读者和作家之间位置的工作方式,这不是流的使用方式。
也许我的概念问题是因为我的BaseStream是MemoryStream,并且规则与NetworkStream的规则不同。 我试图将流源的实现细节保留在阅读类之外。
我想在这一点上我已经回答了这个问题。 现在,我需要查找有关使用流来执行自己头脑中的事情的信息。
我发现使用MemoryStream的Reader和Writer更新了基本流中的位置。 因此,如果不费力地复制和还原位置值,就无法读取仍在写入的流。 不建议。
我做了一些修改,以便可以将整个事务写入MemoryStream并将其传递给另一个类。 为下一个事务创建一个新的MemoryStream。
基本流不是给定流的派生,而是实际流。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.