buffer

前言

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

例子

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

type Buff struct {
Buffer *bytes.Buffer
Writer *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个byte
bufRead.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还是上次的读出结果
ReadByte
    buf := bytes.NewBufferString("hello")
fmt.Println(buf.String()) // buf.String()方法是吧buf里的内容转成string,>以便于打印
b, _ := buf.ReadByte() // 读取第一个byte,赋值给b
fmt.Println(buf.String()) // 打印 ello,缓冲器头部第一个h被拿掉
fmt.Println(string(b)) // 打印 h
ReadRune
    buf := bytes.NewBufferString("好hello")
fmt.Println(buf.String()) // buf.String()方法是吧buf里的内容转成string,>以便于打印
b, n, _ := buf.ReadRune() // 读取第一个rune,赋值给b
fmt.Println(buf.String()) // 打印 hello
fmt.Println(string(b)) // 打印中文字: 好,缓冲器头部第一个“好”被拿掉
fmt.Println(n) // 打印3,“好”作为utf8储存占3个byte
b, n, _ = buf.ReadRune() // 再读取第一个rune,赋值给b
fmt.Println(buf.String()) // 打印 ello
fmt.Println(string(b)) // 打印h,缓冲器头部第一个h被拿掉
fmt.Println(n) // 打印 1,“h”作为utf8储存占1个byte
ReadBytes

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

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

ReadStringReadBytes一样,也是需要一个分隔符进行,buffer

	var d byte = 'e' //分隔符为e
buf := bytes.NewBufferString("hello")
fmt.Println(buf.String()) // buf.String()方法是吧buf里的内容转成string,以便于打印
b, _ := buf.ReadString(d) // 读到分隔符,并返回给b
fmt.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】https://my.oschina.net/u/943306/blog/127981

go中bytes.Buffer使用小结的更多相关文章

  1. golang bytes.Buffer Reset

    func t() { a := []'} buf := new(bytes.Buffer) buf.Write(a) b := buf.Bytes() fmt.Println(b) buf.Reset ...

  2. Java NIO中的Buffer 详解

    Java NIO中的Buffer用于和NIO通道进行交互.如你所知,数据是从通道读入缓冲区,从缓冲区写入到通道中的.缓冲区本质上是一块可以写入数据,然后可以从中读取数据的内存.这块内存被包装成NIO ...

  3. C#中使用Buffer.BlockCopy()方法将string转换为byte array的方法:

    public static void BlockCopy(Array src, int srcOffset, Array dst, int dstOffset, int count); 将指定数目的字 ...

  4. Java网络编程和NIO详解4:浅析NIO包中的Buffer、Channel 和 Selector

    Java网络编程与NIO详解4:浅析NIO包中的Buffer.Channel 和 Selector 转自https://www.javadoop.com/post/nio-and-aio 本系列文章首 ...

  5. Golang之bytes.buffer

    bytes.buffer是一个缓冲byte类型的缓冲器存放着都是byte Buffer 是 bytes 包中的一个 type Buffer struct{-} A buffer is a variab ...

  6. Free中的buffer和cache理解

    吐血推荐文章: Linux内存中的Cache真的能被回收么? free中的buffer和cache: redhat对free输出的解读 两者都是RAM中的数据.简单来说,buffer是即将要被写入磁盘 ...

  7. Java网络编程与NIO详解4:浅析NIO包中的Buffer、Channel 和 Selector

    微信公众号[黄小斜]作者是蚂蚁金服 JAVA 工程师,目前在蚂蚁财富负责后端开发工作,专注于 JAVA 后端技术栈,同时也懂点投资理财,坚持学习和写作,用大厂程序员的视角解读技术与互联网,我的世界里不 ...

  8. Golang bytes.buffer详解

    原文:https://www.jianshu.com/p/e53083132a25 Buffer 介绍 Buffer 是 bytes 包中的一个 type Buffer struct{…} A buf ...

  9. Python3.x中bytes类型和str类型深入分析

    Python 3最重要的新特性之一是对字符串和二进制数据流做了明确的区分.文本总是Unicode,由str类型表示,二进制数据则由bytes类型表示.Python 3不会以任意隐式的方式混用str和b ...

  10. 【转】Netty那点事(二)Netty中的buffer

    [原文]https://github.com/code4craft/netty-learning/blob/master/posts/ch2-buffer.md 上一篇文章我们概要介绍了Netty的原 ...

随机推荐

  1. Hugging News #0113:DreamBooth 编程马拉松活动保姆级视频教程来了!

    每一周,我们的同事都会向社区的成员们发布一些关于 Hugging Face 相关的更新,包括我们的产品和平台更新.社区活动.学习资源和内容更新.开源库和模型更新等,我们将其称之为「Hugging Ne ...

  2. 压测工具 Locust

    一.认识Locust 定义 Locust是一款易于使用的分布式负载测试工具,完全基于事件,即一个locust节点也可以在一个进程中支持数千并发用户,不使用回调,通过gevent使用轻量级过程(即在自己 ...

  3. AIGC加速迭代,云栖大会视频云「媒体服务」专场与你共话云智深度融合

    2023杭州·云栖大会 倒计时5天! 阿里云视频云 5大并行Session 11场话题演讲 深度演绎云智融合的全面进化 「媒体服务」Tech专场 重磅议题剧透来袭 01 「媒体服务」Tech • 新数 ...

  4. Java 时间戳和时间相互转换 日期时间和字符串相互转换 日期时间相减差值 日期时间增加指定天数

    Java 时间戳和时间相互转换 日期时间和字符串相互转换 日期时间相减差值 日期时间增加指定天数 代码: package com.sux.demo; import java.text.ParseExc ...

  5. div模拟表格单元格合并

    效果如下图: html代码如下: 1 <ul class="schedule-list"> 2 <li class="schedule-title&qu ...

  6. React报错之Property does not exist on type 'JSX.IntrinsicElements'

    正文从这开始~ 总览 当组件名称以小写字母开头时,会导致"Property does not exist on type 'JSX.IntrinsicElements'"错误.为了 ...

  7. 基于python+django的酒店预定网站-酒店管理系统

    该系统是基于python+django开发的酒店预定管理系统.适用场景:大学生.课程作业.毕业设计.学习过程中,如遇问题可在github给作者留言. 演示地址 前台地址: http://hotel.g ...

  8. 【Hash】字符串哈希

    Hash 的核心思想在于,将输入映射到一个值域较小.可以方便比较的范围,典型的用法就是将资源紧张的设备中的不定长字符串转化为定长整数,以达到节省空间的目的 如:printf("This is ...

  9. CSS : object-fit 和 object-position实现 图片或视频自适应

              img {             width: 100%;             height: 300px;             object-fit: cover;   ...

  10. Oracle索引&约束

    Oracle索引&约束 1索引的原理 索引是一种允许直接访问数据表某一数据行的树形结构,为了提高查询效率而引入,是独立于表的对象,可以存放在与表不同的表空间(TABLESPACE)中 索引记录 ...