2019/10/17 04-缓冲区

在这里插入图片描述
buffer一把翻译为缓冲,可以认为是一个先进先出FIFO的队列,缓冲的作用是非常大的,
1.在某一段时间产生大量数据,但是来不及处理,就等等,慢慢开闸,慢慢放
2.几件事缓冲,到时候一起做
大多数缓冲区都是先进先出的,极少是环状的
buffering,给的参数是-1,表示使用缺省大小的buffer(buffering是有个默认的)。如果是二进制模式,使用io.DEFAULT_BUFFER_SIZE值,默认是4096或8192。
如果是文本模式,如果是终端设备,是行缓存方式,如果不是,则使用二进制模式的策略
还可以给0: 只在二进制模式使用,表示关buffer(数据来了,直接往磁盘上写)
1: 只在文本模式使用,表示使用行缓冲。意思就是见到换行符就flush
大于1:用于指定buffer大小

在这里插入图片描述
FIFO队列的意思就是先进先出,缓冲区满了或者达到阈值,数据才会flush到磁盘。(一般buffer,cache都是在内存中开辟这样的数据结构,也就是在内存中是使用buffer和cache,但是不见得不能在磁盘开一个空间出来,但是嫌慢一般不用,)缓存是为了查,缓冲是为了攒(因为洪水来了,下游来不及处理)缓冲要高效,放到内存即可,
有的时候撑满了,就不能放了(因为内存开辟是连续的空间,所以后面设计就环形的)
一般缓冲都是有大小的不可能无限增加

**flush是将缓冲区的数据写入磁盘close,关闭前会调用flush(flush会主动把缓冲区数据倒出去,往磁盘写)close会调用前使用flush,这就是为什么close就能看到数据了
io.DEFAULT_BUFFER_SIZE缺省缓冲区大小,字节
**
在这里插入图片描述在这里插入图片描述
查看linux下,这个单位是字节,缓冲的一定大小,就一批写入,(因为磁盘是扇区的,一片片写是比较快的,写一个字节再写另外一个,是比较要命的了)
在这里插入图片描述
w是从头写,写完之后再重头写(seek0)
在这里插入图片描述
还读不到数据,因为指针在后面
在这里插入图片描述在这里插入图片描述
向后覆盖的,没覆盖的就是原来什么就是什么
在这里插入图片描述在这里插入图片描述在这里插入图片描述
现在就完全覆盖了
在这里插入图片描述
已经有数据了
在这里插入图片描述在这里插入图片描述
再看一下没有改变,123还在缓冲区里没有写数据
在这里插入图片描述在这里插入图片描述
也没有写入
在这里插入图片描述在这里插入图片描述
还没写入
在这里插入图片描述在这里插入图片描述
没有调用flush,这里面用了一个seek,经过测试发现,官方没说,只要用seek就会强行flush一次,缓冲区数据会写一次硬盘
要理解缓冲写的时候数据去哪里了,从缓冲区出来叫给操作系统,操作系统还有内核,内核还要调用文件子系统,还需要调用驱动层,驱动层还需要有缓冲,缓冲以后进磁盘缓冲,等待,一定时间后把一批数据一起写入磁盘
在这里插入图片描述
操作文件的时候很少使用seek,如果想要看到现在修改的数据,就需要经常手动调用flush,缓冲区是有意义的,如果一个个字节就处理的,操作系统光给你弄这个了,其他都不需要干 了,这种东西最欢迎的就是批处理,一批一批处理

我们写数据是不断直接数据的,没必要中途seek,中途覆盖这样的情况非常少,seek基本上用不到

buffer有几个特殊场景是你要用到的
在这里插入图片描述在这里插入图片描述
设置4,大于1代表指定buffering的大小了
在这里插入图片描述
w就把之前的清空了
在这里插入图片描述
cat看不到
在这里插入图片描述在这里插入图片描述
还是没有
在这里插入图片描述在这里插入图片描述

在这里插入图片描述
二进制的时候,这个值是有用的,4096,8092是比较有用的,不宜过大不宜过小,磁盘上的扇区一般是512字节,有些文件创建的时候显示0k,一般都是分配4k,最小一般是给4k,为什么设计4096就是够4k的意思,文件再磁盘上有个最小占用空间,磁盘如果有成千上万的小文件,是非常消耗磁盘空间的
这个4最好还是不要调,缺省参数还是最好的参数,我们需要一个跟512成倍数的进行处理

在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述
改成文本模式,这里1是给文本模式使用在这里插入图片描述
必须是string
在这里插入图片描述在这里插入图片描述
空的
在这里插入图片描述
再添加10个
在这里插入图片描述
再cat还是没有在这里插入图片描述在这里插入图片描述
都写进去了,这叫行缓冲模式,看见行分隔符,就该断一行了
在这里插入图片描述在这里插入图片描述
再添加看不到在这里插入图片描述在这里插入图片描述在这里插入图片描述
再次增加
在这里插入图片描述在这里插入图片描述
跟着换行符,后面的abc也出去了,整体都flush
在这里插入图片描述在这里插入图片描述
这就是行缓冲模式
在这里插入图片描述在这里插入图片描述在这里插入图片描述
里面不变还在缓冲区
在这里插入图片描述在这里插入图片描述
还没变
在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述
多弄几下
在这里插入图片描述在这里插入图片描述
还是不成功
在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述
没变
在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述
还没有写进去
在这里插入图片描述在这里插入图片描述在这里插入图片描述
出来了,是一个大概的大小,不是真的到8092在这里插入图片描述
这个10好像没什么作用,只有1好像是行缓冲的作用,写2也不是2个字节,写10也不是10个字节,除了1,其他都没什么用在这里插入图片描述
在文本模式下就是使用的缺省缓冲区大小,刚才测试过,确实达到了一定的值就显示出来了在这里插入图片描述
缓冲区大小指定了跟没指定一样,没用在这里插入图片描述
0是留给二进制使用的
在这里插入图片描述
w方式打开,相当于覆盖原来的
在这里插入图片描述在这里插入图片描述
再写b进去
在这里插入图片描述
写一个出来一个,只要write一执行,就不会经过缓冲区了,直接写入磁盘,相当于不使用这个缓冲区,直接写磁盘
在这里插入图片描述在这里插入图片描述
不需要内存的buffer,可以看作是一个FIFO文件,给个字节是一个字节,相当于一个字节序列写进去,FIFO也变成了一个缓冲区,这个缓冲区只不过不想用,在磁盘上很慢,宁愿用内存的,但是可以看作是一个buffer文件 在这里插入图片描述
每次写进去就能看见,关闭不关闭都会直接写入磁盘,用不用flush都写磁盘了
buffering=-1,t和b都使用缺省值
buffering=0,对于t不支持,对于b是关闭缓冲区,直接i写入磁盘
buffering=1,b就1个字节,t行缓冲,遇到换行符才flush
buffering>1,b模式表示行缓冲区大小。缓冲区的值可以超过io.DEFAULT_BUFFER_SIZE,直到设定的值超出缓冲区 flush。
t模式,是io.DEFAULT_BUFFER_SIZE字节,flush完后把当前字符串也写入磁盘

在这里插入图片描述
1.文本模式一般都是要缓冲区默认大小
2.二进制模式,是一个个字节的操作,可以指定buffer的大小(建议使用默认)
3.一般来说,默认缓冲区大小是个比较好的选择,除非明确知道,否则不调整它
4.一般编程中,明确知道要写磁盘了,都会手动调用一次flush,而不是等到自动flush或者close的时候(需要flush的时候才去使用)
buffering别调,flush除非明确知道有好处
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值