BandMan home

Stream读写性能

流缓冲是相对于硬盘而言的,在计算机硬件组成原理提过,内存相当于硬盘的缓冲区,寄存器相当于内存的缓冲区

流与文件头

流Stream读取文件内容时,同时也要读取类型,根据类型知道每个单词的空间大小,那么延伸到文件系统,文件也有“类型”之说,程序源文件、标准输出cout文件等文件都具有文件头。

所以流Stream也一定有识别文件头部的能力,那么如何识别呢?

二进制流

图片/音频文件用二进制流来表示。 计算机的存储在物理上都是二进制流的,所以文本文件与二进制文件的区别是逻辑上的。 那为什么要用二进制流来表示图片呢?

  1. 二进制文件比较节约空间,字符型数据存储的话二者差别不大,但储存数字时,差别很大。
  2. 内存中参加计算的数据都是无格式的,文本文件则需要一个转换的过程。
  3. 涉及到浮点数据时,二进制存储不会造成误差。

原则:尽量少的资源存储尽量多的信息

短暂目的:将Excel表数据转成适应类的结构

文本文件的读写

二进制文件的读写

数据块(文件内)的读写

指针指向excel表的文件头部。

二进制文件中有一个指针,指向当前数据在文件中的位置,这个文件指针和一般的指针变量不一样,它只是一个纯粹的指示器。

缓存和同步(Buffers and Synchronization)

当我们对文件流进行操作的时候,它们与一个streambuf 类型的缓存(buffer)联系在一起。这个缓存(buffer)实际是一块内存空间,作为流(stream)和物理文件的媒介。例如,对于一个输出流, 每次成员函数put (写一个单个字符)被调用,这个字符不是直接被写入该输出流所对应的物理文件中的,而是首先被插入到该流的缓存(buffer)中。

当缓存被排放出来(flush)时,它里面的所有数据或者被写入物理媒质中(如果是一个输出流的话),或者简单的被抹掉(如果是一个输入流的话)。这个过程称为同步(synchronization),它会在以下任一情况下发生:

当文件被关闭时: 在文件被关闭之前,所有还没有被完全写出或读取的缓存都将被同步。 当缓存buffer 满时:缓存Buffers 有一定的空间限制。当缓存满时,它会被自动同步。 控制符明确指明:当遇到流中某些特定的控制符时,同步会发生。这些控制符包括:flush 和endl。 明确调用函数sync(): 调用成员函数sync() (无参数)可以引发立即同步。这个函数返回一个int 值,等于-1 表示流没有联系的缓存或操作失败。

文件流与文件描述符

一句话,流是文件描述符的抽象(流等同于文件描述符),一般使用文件描述符是系统层次的调用。 当向一个文件读入或输出时,既可以选择流,也可以选择文件描述符,文件描述符用int类型,流是用FILE*类型。

使用流的原因:

文件描述符(Linux)/句柄(Windows)是系统层级的调用.

Fork me on GitHub