现在我正在阅读这篇文章C# 中缓冲区和流之间的区别,我想首先了解一下,我正确理解了执行指令时引擎盖下发生的情况FileStream stream = new FileStream("filepath.txt", FileMode.open)。
我对正在发生的事情的理解
HDD/SSD 上有一个文件filepath.txt可能比 RAM 还要大。并且在执行上述指令时,运行时环境就像是在这个文件的开头带来了一个软管并打开了水龙头。Vodichka(字节)不会立即流动,而只是准备就绪。
我是否正确描述了一切?
粗略地说,流是一个可以读取数据的地方,或者是一种流行的写入数据的地方。可以说,这是一个抽象的概念。这里例如我们创建一个线程来访问一个文件
该示例实例化了一个
FileStream继承自的类Stream。这允许我们读取和写入文件。类型MemoryStream- 表示内存读/写流。NetworkStream- 网。等等。因此,到目前为止,我们一直在讨论作为数据源和/或接收器的线程。但是,除了这些线程之外,还有线程——装饰器。装饰器本身不是数据的来源或接收器。它们将流作为参数并将其用于读取和写入操作。他们需要什么?继续阅读。
接下来
BufferedStream是 Stream 上的装饰器。它允许您缓冲写入/读取到流。这对文件 I/O 很有用,因为使用缓冲区读取/写入可减少写入/读取次数,从而提高性能。它可以与任何流一起使用,例如正如我所说,
BufferedStream这是一个装饰器,也就是说,它只是扩展了被装饰的流的能力。这是另一个装饰器的示例- 我用它来监视读/写操作由于这些只是装饰器,因此可以组合它们,例如
现在,最终流
bufferedFileStream是读取/写入带有操作记录的文件的缓冲流。因此,如果您仅使用 FileStream 读取一个字节,您将只读取一个字节。如果你从一个用缓冲区修饰的文件流中读取一个字节,那么你要么是从磁盘读取整个缓冲区,要么是从内存中的缓冲区读取数据。
是的,你大致正确。只有我会换句话来解释。流是用于接收/发送一些二进制数据的通道。通道连续工作,但数据本身可能会中断。(根据你的寓言 - 有一个管道,但你可以让水进入[数据],或者你不能让它进入)
假设我们正在通过流读取文本文件。这意味着线程本身对“线”这样的实体一无所知,因此不能简单地读取和读取一行。但是流程知道诸如“字节”之类的实体。
我们可以从文件的开头[或从最后一个
/r/n]读取到下一个/r/n字节。这将读取一行。一般来说,线程也可以是一个通道,用于接收/捕获带有这些事件详细信息的事件。假设在 Realm 数据库中,您可以订阅某个 Query(请求)结果的更改。也就是说,如果您有一个查询(有条件地)“获取所有名为 Vasya 的用户”,那么当更改至少一个 Vasya 时,将创建一个事件,该事件将再次沿着流向您发送此查询的结果形式: