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