go中bytes.Buffer使用小结
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
ReadBytes和ReadByte是有区别的。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
ReadString和ReadBytes一样,也是需要一个分隔符进行,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使用小结的更多相关文章
- golang bytes.Buffer Reset
func t() { a := []'} buf := new(bytes.Buffer) buf.Write(a) b := buf.Bytes() fmt.Println(b) buf.Reset ...
- Java NIO中的Buffer 详解
Java NIO中的Buffer用于和NIO通道进行交互.如你所知,数据是从通道读入缓冲区,从缓冲区写入到通道中的.缓冲区本质上是一块可以写入数据,然后可以从中读取数据的内存.这块内存被包装成NIO ...
- C#中使用Buffer.BlockCopy()方法将string转换为byte array的方法:
public static void BlockCopy(Array src, int srcOffset, Array dst, int dstOffset, int count); 将指定数目的字 ...
- Java网络编程和NIO详解4:浅析NIO包中的Buffer、Channel 和 Selector
Java网络编程与NIO详解4:浅析NIO包中的Buffer.Channel 和 Selector 转自https://www.javadoop.com/post/nio-and-aio 本系列文章首 ...
- Golang之bytes.buffer
bytes.buffer是一个缓冲byte类型的缓冲器存放着都是byte Buffer 是 bytes 包中的一个 type Buffer struct{-} A buffer is a variab ...
- Free中的buffer和cache理解
吐血推荐文章: Linux内存中的Cache真的能被回收么? free中的buffer和cache: redhat对free输出的解读 两者都是RAM中的数据.简单来说,buffer是即将要被写入磁盘 ...
- Java网络编程与NIO详解4:浅析NIO包中的Buffer、Channel 和 Selector
微信公众号[黄小斜]作者是蚂蚁金服 JAVA 工程师,目前在蚂蚁财富负责后端开发工作,专注于 JAVA 后端技术栈,同时也懂点投资理财,坚持学习和写作,用大厂程序员的视角解读技术与互联网,我的世界里不 ...
- Golang bytes.buffer详解
原文:https://www.jianshu.com/p/e53083132a25 Buffer 介绍 Buffer 是 bytes 包中的一个 type Buffer struct{…} A buf ...
- Python3.x中bytes类型和str类型深入分析
Python 3最重要的新特性之一是对字符串和二进制数据流做了明确的区分.文本总是Unicode,由str类型表示,二进制数据则由bytes类型表示.Python 3不会以任意隐式的方式混用str和b ...
- 【转】Netty那点事(二)Netty中的buffer
[原文]https://github.com/code4craft/netty-learning/blob/master/posts/ch2-buffer.md 上一篇文章我们概要介绍了Netty的原 ...
随机推荐
- Python 异步编程之yield关键字
背景介绍 在前面的篇章中介绍了同步和异步在IO上的对比,从本篇开始探究python中异步的实现方法和原理. python协程的发展流程: python2.5 为生成器引用.send()..throw( ...
- 比 Python 快得吓人,PyPy 极简入门
众所周知 Python 有一个致命的缺点:速度比 C.C ++ 等语言慢很多.PyPy 恰好可以解决这一问题,它能够让 Python 代码运行得比 C 还快. 比如: import time from ...
- 0x03~04 前缀和与差分、二分
A题:HNOI2003]激光炸弹 按照蓝书上的教程做即可,注意这道题卡空间用int 而不是 long long. int g[5010][5010]; int main() { ios_base::s ...
- 图扑数字孪生智慧机场,助推民航"四型机场"建设
前言 民航局印发的<智慧民航建设路线图>文件中,明确提出智慧机场是智慧民航的四个核心抓手之一.并从机场全域协同运行.作业与服务智能化.智慧建造与运维方面,为智慧机场的发展绘制了清晰的蓝图. ...
- STM32CubeMX教程18 DAC - DMA输出自定义波形
1.准备材料 开发板(正点原子stm32f407探索者开发板V2.4) STM32CubeMX软件(Version 6.10.0) 野火DAP仿真器 keil µVision5 IDE(MDK-Arm ...
- uni-app打包到安卓步骤
1.打包到安卓 https://www.bilibili.com/video/BV1BJ411W7pX?p=56 2.打包到IOS https://www.jianshu.com/p/ef6e6e01 ...
- 大数相加 a+b
#include<stdio.h> #include<string.h> #include<stdlib.h> #include<ctype.h> #i ...
- nohup 与 >/dev/null 与 2>&1 作用与区别
转载请注明出处: 在 Linux 中,>/dev/null 和 2>&1 是两个常用的重定向操作,它们用于控制命令的输出和错误信息.而且这两个参数经常 与 nohup 命令一起使用 ...
- CS2打开可以听到声音,但黑屏问题?
1.问题 我这里原先是可以启动CS2的,但是后来在CS2中重新调整了分辨率等等,之后由于某种原因又调整了屏幕分辨率,导致后面一进入CS2登录界面,橙色登陆界面就会缩在左上角一小块,并且之后就会陷入黑屏 ...
- SpringMVC04——数据处理及跳转
结果跳转 1.ModelAndView 设置ModelAndView对象,根据view的名称,和试图解析器跳到指定的页面. 页面:{视图解析器前缀} + viewName + {视图解析器后缀} &l ...