buffer

前言

最近操作文件,进行优化使用到了buffer。好像也不太了解这个,那么就梳理下,buffer的使用。

例子

我的场景:使用xml拼接了office2003的文档。写入到buffer,然后处理完了,转存到文件里面。

type Buff struct {Buffer *bytes.BufferWriter *bufio.Writer
}// 初始化
func NewBuff() *Buff {b := bytes.NewBuffer([]byte{})return &Buff{Buffer: b,Writer: bufio.NewWriter(b),}
}func (b *Buff) WriteString(str string) error {_, err := b.Writer.WriteString(str)return err
}func (b *Buff) SaveAS(name string) error {file, err := os.OpenFile(name, os.O_WRONLY|os.O_TRUNC|os.O_CREATE, 0666)if err != nil {return err}defer file.Close()if err := b.Writer.Flush(); err != nil {return nil}_, err = b.Buffer.WriteTo(file)return err
}func main() {var b = NewBuff()b.WriteString("haah")
}

了解下bytes.buffer

bytes.buffer是一个缓冲byte类型的缓冲器,这个缓冲器里存放着都是byte

如何创建bytes.buffer

放几种创建的方式

buf1 := bytes.NewBufferString("hello")fmt.Println(buf1)buf2 := bytes.NewBuffer([]byte("hello"))fmt.Println(buf2)buf3 := bytes.NewBuffer([]byte{byte('h'), byte('e'), byte('l'), byte('l'), byte('o')})fmt.Println(buf3) // 以上三者等效buf4 := bytes.NewBufferString("")fmt.Println(buf4)buf5 := bytes.NewBuffer([]byte{})fmt.Println(buf5) // 以上两者等效

查看源码可知

func NewBuffer(buf []byte) *Buffer { return &Buffer{buf: buf} }func NewBufferString(s string) *Buffer {return &Buffer{buf: []byte(s)}
}

NewBufferString也是将参数转成[]byte()。然后,初始化Buffer

bytes.buffer的数据写入

写入string

 buf := bytes.NewBuffer([]byte{})buf.WriteString("小花猫")fmt.Println(buf.String())

写入[]byte

    buf := bytes.NewBuffer([]byte{})s := []byte("小黑猫")buf.Write(s)fmt.Println(buf.String())

写入byte

 var b byte = '?'buf.WriteByte(b)fmt.Println(buf.String())

写入rune

 var r rune = '小'buf.WriteRune(r)fmt.Println(buf.String())

从文件写入

file, err := os.Open("./buffer/test.txt") //test.txt的内容是“world”if err != nil {fmt.Println(err)}defer file.Close()fmt.Println(file.Sync())buf := bytes.NewBufferString("hello ")buf.ReadFrom(file)        //将text.txt内容追加到缓冲器的尾部fmt.Println(buf.String()) //打印“hello world”

数据写出

写出数据到io.Writer

 file, _ := os.Open("text.txt")buf := bytes.NewBufferString("hello")buf.WriteTo(file) // hello写到text.txt文件中了

os.File就是实现io.Writer

Read

 bufRead := bytes.NewBufferString("hello")fmt.Println(bufRead.String())var sRead = make([]byte, 3)   // 定义读出的[]byte为3,表示一次可读出3个bytebufRead.Read(sRead)           // 读出fmt.Println(bufRead.String()) // 打印结果为lo,因为前三个被读出了fmt.Println(string(sRead))    // 打印结果为hel,读取的是hello的前三个字母bufRead.Read(sRead)           // 接着读,但是bufRead之剩下lo,所以只有lo被读出了fmt.Println(bufRead.String()) // 打印结果为空fmt.Println(string(sRead))    // 打印结果lol,前两位的lo表示的本次的读出,因为bufRead只有两位,后面的l还是上次的读出结果
ReadBytebuf := bytes.NewBufferString("hello")fmt.Println(buf.String()) // buf.String()方法是吧buf里的内容转成string,>以便于打印b, _ := buf.ReadByte()    // 读取第一个byte,赋值给bfmt.Println(buf.String()) // 打印 ello,缓冲器头部第一个h被拿掉fmt.Println(string(b))    // 打印 h
ReadRunebuf := bytes.NewBufferString("好hello")fmt.Println(buf.String()) // buf.String()方法是吧buf里的内容转成string,>以便于打印b, n, _ := buf.ReadRune() // 读取第一个rune,赋值给bfmt.Println(buf.String()) // 打印 hellofmt.Println(string(b))    // 打印中文字: 好,缓冲器头部第一个“好”被拿掉fmt.Println(n)            // 打印3,“好”作为utf8储存占3个byteb, n, _ = buf.ReadRune()  // 再读取第一个rune,赋值给bfmt.Println(buf.String()) // 打印 ellofmt.Println(string(b))    // 打印h,缓冲器头部第一个h被拿掉fmt.Println(n)            // 打印 1,“h”作为utf8储存占1个byte

ReadBytes

ReadBytes和ReadByte是有区别的。ReadBytes需要一个分隔符来对buffer进行分割读取。

    var d byte = 'e' //分隔符为ebuf := bytes.NewBufferString("hello")fmt.Println(buf.String()) // buf.String()方法是吧buf里的内容转成string,以便于打印b, _ := buf.ReadBytes(d)  // 读到分隔符,并返回给bfmt.Println(buf.String()) // 打印 llo,缓冲器被取走一些数据fmt.Println(string(b))    // 打印 he,找到e了,将缓冲器从头开始,到e的内容都返回给b

ReadString

ReadString和ReadBytes一样,也是需要一个分隔符进行,buffer

 var d byte = 'e' //分隔符为ebuf := bytes.NewBufferString("hello")fmt.Println(buf.String()) // buf.String()方法是吧buf里的内容转成string,以便于打印b, _ := buf.ReadString(d) // 读到分隔符,并返回给bfmt.Println(buf.String()) // 打印 llo,缓冲器被取走一些数据fmt.Println(b)            // 打印 he,找到e了,将缓冲器从头开始,到e的内容都返回给b

Next

使用Next可依次读出固定长度的内容

 buf := bytes.NewBufferString("hello")fmt.Println(buf.String())b := buf.Next(2)          // 重头开始,取2个fmt.Println(buf.String()) // 变小了fmt.Println(string(b))    // 打印he

Go中bytes.Buffer理解相关推荐

  1. buffer pool mysql_理解Mysql中的Buffer pool

    Buffer Pool在数据库里的地位 1.回顾一下Buffer Pool是个什么东西? 数据库中的Buffer Pool是个什么东西?其实他是一个非常关键的组件,数据库中的数据实际上最终都是要存放在 ...

  2. 怎么理解内存中的Buffer和Cache

    本文是通过学习倪朋飞老师的<Linux性能优化实战> :怎么理解内存中的Buffer和Cache? 怎么理解内存中的Buffer和Cache? free 数据的来源 proc 文件系统 案 ...

  3. linux buffer cache 过高_怎么理解内存中的Buffer和Cache?

    1|0缓存 从 free 命令可以看到,缓存其实就是 Buffer 和 Cache 两部分的总和 字面意思,Buffer 是缓存区,Cache 是缓存,两者都是数据再内存中的临时存储 2|0Buffe ...

  4. Linux内存中的 buffer 和 cache

    Linux内存中的 buffer 和 cache 到底是个什么东东? Linux 中的 free 命令,会输出: total 总量 used  已使用 free 空闲 shared 共享内存 buff ...

  5. Go 语言 bytes.Buffer 源码详解之1

    转载地址:Go 语言 bytes.Buffer 源码详解之1 - lifelmy的博客 前言 前面一篇文章 Go语言 strings.Reader 源码详解,我们对 strings 包中的 Reade ...

  6. Linux中内存buffer和cache的区别

    Linux中内存buffer和cache的区别 分类: LINUX 原文地址:Linux中内存buffer和cache的区别 作者:platinaluo 细心的朋友会注意到,当你在linux下频繁存取 ...

  7. golang bytes.buffer 字节缓冲器 简介

    目录 创建 Buffer缓冲器 NewBuffer NewBufferString 向 Buffer 中写入数据 Write WriteString WriteByte WriteRune 完整示例 ...

  8. python分配buffer_Node.js中的buffer如何和python中的buffer相对应

    我的整个需求可以分解为下面几步: step1.Node.js发送Buffer类型数据: 因为Node.js中fs文件系统读取文件后的回掉中均返回的为Buffer类型的数据, 直接通过queryStri ...

  9. 二十五、Node中的Buffer缓冲器和EventEmitter事件触发器

    @Author:Runsen @Date:2020/6/5 作者介绍:Runsen目前大三下学期,专业化学工程与工艺,大学沉迷日语,Python, Java和一系列数据分析软件.导致翘课严重,专业排名 ...

最新文章

  1. 产品经理的思考利器——UML
  2. RabbitMQ默认端口记录(亲测)
  3. java创建子类对象的步骤_一顿Spring骚操作:我敢说没有人比我更懂Java对象的创建!
  4. mysql数据库根据上传的经纬度计算距离
  5. 深度神经网络关键词解释
  6. 有用户访问我的计算机,事件查看器有个奇怪用户账号登录HOME-W81$,我的电脑没有这个用户账号,本机是win8.1ʌ - Microsoft Community...
  7. Python爬虫解析网页的4种方式 值得收藏
  8. 关于setInterval设置倒计时只执行一次,clearInterval停止
  9. NP、OSPF监测调试
  10. 17082 两个有序数序列中找第k小(优先做)
  11. 舵机的基本了解以及数字舵机和模拟舵机的区别
  12. 数据库-表的定义与操作
  13. Shader山下(十九)标记Tag
  14. VIN码识别又叫车架号识别,OCR技术深度应用
  15. c/c++ 二分法拓展,解决函数零点问题。
  16. 怎么制作动态图片?教你三步制作GIF图片?
  17. Profinet转TCP协议转换网关Step7软件配置方法
  18. 乔布斯:遗失的访谈(1995)有感
  19. 王者荣耀服务器什么时候增加人数,王者荣耀:大区最强王者段位人数超过1万,白菜大神遍地是!...
  20. 仿小米官网php源码,精仿小米官网商城整站完美运营版源码Laravel内核

热门文章

  1. EMNLP 2020 | 基于Wasserstein距离的正则化序列表示
  2. 直播 | 彩云科技CEO袁行远:NLP与冒险游戏研究一览
  3. 开学综合症有救了!17篇最新AI论文不容错过
  4. Java反射:框架设计的灵魂
  5. springBoot静态资源优先级)
  6. Result Maps collection already contains value for ***的问题
  7. mysql limit耗时过长
  8. PyCharm——turtle库的画布悬停解决方案
  9. CG CTF WEB GBK Injection
  10. Bear and Finding Criminals