• 读取流
  • 写入流

把数据看作是有序的字节排列,使用一个位置指针完成内存对数据流的读写

缓冲区

数据每读取到内存一次,既是一次磁盘 I/O操作,如果不做缓冲区,那么会频繁操作磁盘,性能较差。所以通常会设置一个内存分页适配大小的缓冲区(2k、4k)在内核态中,然后再设置一个流中的缓冲区,缓冲从内核拷贝过来的数据。也可以开辟一块内存区将数据映射到能够让用户态读取,减少一次拷贝,这个能力在 Java 的 NIO 中称作 DirectMemory,对应 C 语言是 mmap

在网络编程中,缓冲区通常用来做削峰,缓冲区中的数据通常具有朴素的公平,说白了就是排队,先进先出(FIFO)。从数据结构的设计上,缓冲区像一个队列。在实际的使用场景中,缓冲区有一些自己特别的需求,比如说缓冲区需要被重复利用。多次读取数据,可以复用一个缓冲区,这样可以节省内存,也可以减少分配和回收内存的开销

flip(缓冲区读写状态置换)

image.png