C#流Stream与IO详解(4)——如何更快的读写文件

【前言】

在我们追求更快读写速度时,通常都是为了读写二进制文件,而不是文本文件,所以这里只说FileStream、BinaryReader、BinaryWriter的使用。

从前文的源码解读中能看到使用BinaryReader和BinaryWriter进行IO读写时本质还是调用了FileStream的接口,所以我们这里只说FileStream的使用即可。

此外,我们这里说的更快读写是指在同一个线程中的读写,而不是使用多线程读写。

【打开关闭文件】

打开和关闭文件是非常耗时的操作,有如下优化方式:

1.如果只需要读写一个文件,但需要在多个地方读写文件,应该持有同一个FileStream,而不是每次new一个FileStream

2.如果要读写很多文件,应该先创建一系列的FileStream,而不是每次需要的时候再创建FileStream。

【读写文件】

FileStream自己有个Buffer,读写数据时要避免使用这个buffer,因为会多一次copy,这个buffer的大小默认为4kb(可以在new的时候自定义大小),自己指定的Array的大小要大于或等于4kb。因此,优化措施如下:

1.每次读取文件的大小至少为4kb,即使你实际并不需要4kb的大小,然后从自己指定的Array中获取想要的数据。即使文件大小不足4kb,自己指定的Buffer的大小也要为4kb。

2.写入数据时凑足4kb再写入,如果数据不足4kb,可以补充些无用的数据到4kb,或者将buffersize设置的小点

3.如果需要同时读写,不要交叉读写。

【寻找位置】

从前文的源码可以知道,在寻找位置时,可能存在Copy的步骤,为了加快寻找位置,同样需要在读写数据时要避免使用FileStream的buffer