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

cdh0805010 · · 2910 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

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确实写得很有意思。


有疑问加站长微信联系(非本文作者)

本文来自:开源中国博客

感谢作者:cdh0805010

查看原文:Go圣经-学习笔记入门bufio.Writer

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

2910 次点击  
加入收藏 微博
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传