代码之家  ›  专栏  ›  技术社区  ›  user113476

“流”的基本结构

  •  0
  • user113476  · 技术社区  · 15 年前

    什么是被称为“流”的概念的基本结构?它们在内部是如何工作的?

    内存流是如何工作的?

    文件流是如何工作的?

    编辑 -从回答中我猜每种类型的流的实现方式是不同的,但核心概念是由一个类或一组函数控制和建模的字节序列。是这样吗?

    3 回复  |  直到 12 年前
        1
  •  1
  •   Colin Mackay    15 年前

    维基百科的这个定义怎么样? http://en.wikipedia.org/wiki/Stream_(computing)

        2
  •  0
  •   unknown    15 年前

    “流”的概念只是由一个类封装的字节序列,该类跟踪流的长度、当前位置、对象数或字节数等。并提供在对象流(或字节等)中来回搜索的功能。

    所以你所说的底层“构造”只是一个字节数组(或者磁盘上的一个文件,或者指向类、结构甚至整数类型的指针),它根据流封装“服务”它上面的对象。

    想象一下,我有10只橡皮鸭,站在一条真实世界的小溪旁。我在河里放了一只鸭子,它开始顺流而下。我现在有一只鸭子在河里。我把另一只鸭子放在河里,它开始顺流而下。我现在有两只鸭子在河里。这一直持续到…你的内存用完了。现在我顺流而下,从水里抓第二只鸭子(寻找)。现在小河里有9只鸭子,我在2号位置…

    因此,流式处理对象不同于将其放在数组或列表中,因为它可以由封装流类“操作”。

    流的整洁之处在于,可以在其他流的顶部创建不同的流,从而允许某种程度的抽象。例如,在.NET中,我可以在文件流的顶部创建一个流写器,它允许我将字符串写入文件流,而不必手动将它们转换为字节数组。

    希望能有所帮助。请随意更正或添加任何必要的内容。我不自称是专家。

    (顺便说一句,没有必要迟钝和声称“太笼统”,“我不明白”等……让我们更加理解和礼貌一点,从讲坛上下来,以合理的方式解释事情。)

        3
  •  0
  •   Pavel Minaev    15 年前

    我想你对C感兴趣# FileStream MemoryStream (或者Java中的类似物和其他类似的语言/框架)。

    内存流通过流接口公开连续的内存块。这通常实现为表示当前字节的数组和索引(或指针)。内存流可以是非增长的,在这种情况下,数组的大小预先定义,并且不能改变和增长,在这种情况下,如果现有数组不适合数据,则分配新的数组,并且复制内存。作为一种优化,对于增长的流数组通常被分配的大小大于当前流中所有数据所需的大小——这是为了当最后写入更多的数据时,可以快速使用未使用的空间,而不需要在每个写入上重新分配数组。通过这种优化,流将需要跟踪数组中除了大小之外还有多少空间未使用。

    文件流通常要简单得多,因为操作系统本身已经将文件公开为流(即,您可以让操作系统api在文件中读/写/查找)。因此,文件流通常只包装一个os文件句柄,并提供委托给那些os api的方法。有时,由于性能原因,它们会提供额外的缓冲,例如,提供给 FileStream.Write 不会立即传递给操作系统“写块到文件”api,而是缓存在缓冲区(通常是数组)中。当发生足够的写操作,缓冲区已满时,将调用os api。

    操作系统本身如何在其文件上实现这些流原语操作是高度特定于操作系统的。