• 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

  • 相关阅读:
    Java --- JVM虚拟机栈
    mysql 日志总结
    GAN详解
    Unity-Tilemap 瓦片地图
    Stable Diffusion生成图片的参数查看与抹除方法
    cubase流水账
    信息学奥赛一本通:1309:【例1.6】回文数(Noip1999)
    MySQL的介绍
    USACO21FEB Modern Art 3 G
    HTTP 协商缓存 ETag、If-None-Match
  • 原文地址:https://blog.csdn.net/enternalstar/article/details/132985222