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. Python openpyxl 将 Excel中的汉字 转换成拼音首字母

    将Excel中的汉字列,转换成拼音首字母,并保存 需要安装导入  pypinyin.openpyxl 库 # pip install pypinyin from pypinyin import laz ...

  2. Flutter 自定义组件实战之Cupertino(iOS)风格的复选框

    继上一篇Flutter自定义组件的视频短课(视频地址: https://www.bilibili.com/video/BV1ap4y1U7UB/ )后,我们继续来聊自定义组件.视频中我为大家详解了Cu ...

  3. 浅谈splice( )与slice( )

    1.splice( ) 概念:splice( )用于修改原始数组,它可以删除.插入.替换数组的元素,并返回被删除的元素组成的新数组. 语法:splice(start,deleteCount,item1 ...

  4. PS CJ37/CJ38 增加和返回预算

    一.预算补充CJ37/预算返回CJ38 二.补充预算CJ37,点击保存 预算返回CJ38,点击保存 三.代码示例 预算补充代码 "------------------------------ ...

  5. C# NLog 配置

    首先用NuGet安装NLog依赖DLL NLog NLog.Config NLog.Schema NLog配置文件NLog.config: <?xml version="1.0&quo ...

  6. 10.4K Star!程序员为程序员针对性优化的开源免费笔记

    平时我一直用Notion来记录内容为主,但也一直关注着其他开源产品.上周正好看到一款非常受欢迎的开源免费笔记,今天就推荐给大家:VNote. VNote一个由程序员为程序员打造的开源笔记应用,基于Qt ...

  7. AtCoder Beginner Contest 211 (C ~ E) 个人题解

    比赛链接:Here A.B题跳过 C - chokudai 题意: 给出一个字符串,问有多少个字串能构成 chokudai 这道题算是一个简单DP,只要计算某个位置对构成 chokudai 的贡献值即 ...

  8. Latex公式排版问题总结

    Latex写博客和论文,因为有模板,所以用起来还是很方便的. 但是在实际使用中,由于论文是双栏的,因此比较长的公式在排版时会比较困难.下面对Latex中的公式排版方法做一些记录. Latex公式排版( ...

  9. HHKB Programming Contest 2020 补题记录(D题投影,E题预处理节省时间)

    补题链接:Here A - Keyboard 签到,S 为 Y 则输出大写 T,不然则原样输出 T int main() { ios_base::sync_with_stdio(false), cin ...

  10. 深入理解web协议(二):DNS、WebSocket

    本文首发于 vivo互联网技术 微信公众号链接:https://mp.weixin.qq.com/s/AkbAN4UZLDf841g1ZLFPBQ作者:Wu Yue 本文系统性的讲述了 DNS 协议与 ...