Go圣经-学习笔记入门bufio.Writer


声明:本文转载自https://my.oschina.net/u/3287304/blog/1554311,转载目的在于传递更多信息,仅供学习交流之用。如有侵权行为,请联系我,我会及时删除。

Go圣经-学习笔记入门bufio.Scanner

bufio标准库中的Reader和Writer,最好用于文件IO操作,把数据先缓存到内存中,然后再整体做文件IO操作,尽最大可能地减少磁盘IO,但是内存缓冲区的大小要合理设置,默认大小是4096个字节。

bufio.Writer使用

bufio标准库中的Writer提供的方法列表

type Writer struct {     err error     buf []byte     n   int     wr  io.Writer }  // 实例化bufio.Writer, 实例化是会直接分配大小为len(w.buf)大小的内存空间,Writer.n表示内存缓冲区已经存放的字节大小 func NewWriter(w io.Writer) *Writer func NewWriterSize(w io.Writer, size int) *Writer  // 表示可用的内存缓冲区大小len(b.buf)-n func (b *Writer) Avaliable() int  // 表示已使用的内存缓冲区大小b.n func (b *Writer) Buffered() int  // 这个首字母大写,表示用户可以手动触发内存缓冲区的数据,回写到wr.Write所指定的地方,一般为磁盘IO回写 func (b *Writer) Flush() error  // bufio.Writer把数据写到缓冲区挺有意思的。 // 开发者可以阅读源码了解一下。我举第二个方法Write([]byte) func (b *Writer) ReadFrom(r io.Reader) (int64, error) func (b *Writer) Write(p []byte) (int, error) func (b *Writer) WriteByte(c byte) error func (b *Writer) WriteRune(r rune) (int, error) func (b *Writer) WriteString(s string) (int, error) 

对于func (b *Writer) Write(p []byte) (int, error)方法的正确理解:

  1. 如果内存缓冲区剩余空间小于len(p),分两种情况讨论:
    • 如果当前内存缓冲区为空,则直接把p数据写入到磁盘IO,b.wr.Write(p);
    • 如果当前内存缓冲区不空,则首先把缓冲区填满,然后先把内存缓冲区的数据进行一次磁盘IO回写操作,之后内存缓冲区可用大小有是len(Writer.buf)长度了,这时又分两种情况讨论:第一种:如果剩余要处理的p数据小于内存缓冲区的大小, 则把剩余数据p写入到内存缓冲区;第二种:如果剩余要处理的p数据大于等于内存缓冲区,则没必要缓冲了,直接整体一次回写到磁盘
  2. 如果内存缓冲区剩余空间大于等于len(p), 则先把数据暂存到缓冲区,减少磁盘IO。

总结:bufio的Reader和Writer操作一般适用于磁盘IO的读写场景。同时了解标准库的实现, 可以提高自己的编程思维。标准库bufio确实写得很有意思。

本文发表于2017年10月22日 08:34
(c)注:本文转载自https://my.oschina.net/u/3287304/blog/1554311,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。如有侵权行为,请联系我们,我们会及时删除.

阅读 1858 讨论 0 喜欢 0

抢先体验

扫码体验
趣味小程序
文字表情生成器

闪念胶囊

你要过得好哇,这样我才能恨你啊,你要是过得不好,我都不知道该恨你还是拥抱你啊。

直抵黄龙府,与诸君痛饮尔。

那时陪伴我的人啊,你们如今在何方。

不出意外的话,我们再也不会见了,祝你前程似锦。

这世界真好,吃野东西也要留出这条命来看看

快捷链接
网站地图
提交友链
Copyright © 2016 - 2021 Cion.
All Rights Reserved.
京ICP备2021004668号-1