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除非明确知道有好处