Go中各种newreader和newbuffer的使用

一、bytes.NewBuffer和bytes.NewReader

cpp 复制代码
func main() {
	var byteArr []byte
	buf := bytes.NewBuffer(byteArr)
	buf.Write([]byte("今天不错"))
 
	fmt.Println(buf.String())
}
cpp 复制代码
package main
 
import (
	"bytes"
	"fmt"
)
 
func main() {
	data := []byte("路多辛的所思所想")
	reader := bytes.NewReader(data)
 
	// 读取整个字节数组
	buf := make([]byte, len(data))
	_, err := reader.Read(buf)
	if err != nil {
		fmt.Println("Read failed:", err)
	}
	fmt.Println("Bytes read:", buf)
 
	// 读取字节切片的一部分
	part := make([]byte, 3)
	_, err = reader.Read(part)
	if err != nil {
		fmt.Println("Read failed:", err)
	}
	fmt.Println("Bytes read:", part)
 
	// 查找并读取字节切片中的某个字符
	offset, err := reader.Seek(6, 0)
	if err != nil {
		fmt.Println("Seek failed:", err)
	}
	ch, size, err := reader.ReadRune()
	if err != nil {
		fmt.Println("ReadRune failed:", err)
	}
	fmt.Printf("Read %c with size %d at offset %d\n", ch, size, offset)
}

二、strings.NewReader(没有newWriter)

cpp 复制代码
	r := strings.NewReader("abcdefghijklmn")
	fmt.Println(r.Len())   // 输出14  初始时,未读长度等于字符串长度
	var buf []byte
	buf = make([]byte, 5)
	readLen, err := r.Read(buf)
	fmt.Println("读取到的长度:", readLen) //读取到的长度5
	if err != nil {
		fmt.Println("错误:", err)
	}
	fmt.Println(buf)            //adcde
	fmt.Println(r.Len())        //9   读取到了5个 剩余未读是14-5
	fmt.Println(r.Size())       //14   字符串的长度

三、bufio.NewReader和bufio.NewWriter

cpp 复制代码
package main
import (
	"fmt"
	"io"
	"os"
)
func main() {
	fmt.Println("嗨客网(www.haicoder.net)")
	fileName := "C:/haicoder.txt"
	file, err := os.Open(fileName)
	if err != nil{
		fmt.Println("Read file err, err =", err)
		return
	}
	defer file.Close()
	var chunk []byte
	buf := make([]byte, 1024)
	for{
		n, err := bufio.NewReader(buf)
		if err != nil && err != io.EOF{
			fmt.Println("read buf fail", err)
			return
		}
		//说明读取结束
		if n == 0 {
			break
		}
		//读取到最终的缓冲区中
		chunk = append(chunk, buf[:n]...)
	}
	fmt.Println("File Content =", string(chunk))
}
cpp 复制代码
package main
import (
	"bufio"
	"fmt"
	"io/ioutil"
	"os"
)
func main() {
	fmt.Println("嗨客网(www.haicoder.net)")
	var(
		fileName = "C:/haicoder.txt"
		content = "Hello HaiCoder"
		file *os.File
		err error
	)
	//使用追加模式打开文件
	file, err = os.OpenFile(fileName, os.O_APPEND, 0666)
	if err != nil{
		fmt.Println("Open file err =", err)
		return
	}
	defer file.Close()
	writer := bufio.NewWriter(file)
	//写入文件
	n, err := writer.Write([]byte(content))
	if err != nil{
		fmt.Println("Write file err =", err)
		return
	}
	fmt.Println("Write file success, n =", n)
	writer.Flush()
	//读取文件
	fileContent, err := ioutil.ReadFile(fileName)
	if err != nil{
		fmt.Println("Read file err =", err)
		return
	}
	fmt.Println("Read file success =", string(fileContent))
}

总结:

1、使用的newbuffer,缓存区是用来存储内容的,并不能确定具体需要的内存大小,因此newbuffer的参数为不固定的[]byte{};

2、使用的newreader,缓存区应该是有数值的,此时是用来读取其中的内容。

相关推荐
黄焖鸡能干四碗4 分钟前
系统安全设计方案,软件系统安全设计方案
开发语言·数据库·安全·vue·系统安全
dragoooon3424 分钟前
C++——string的了解和使用
c语言·开发语言·c++·学习·学习方法
格林威41 分钟前
Baumer工业相机堡盟工业相机如何通过DeepOCR模型识别判断数值和字符串的范围和相似度(C#)
开发语言·人工智能·python·数码相机·计算机视觉·c#·视觉检测
sanggou43 分钟前
InterSystems IRIS安装部署
开发语言
{⌐■_■}1 小时前
【软件工程】tob和toc含义理解
前端·数据库·mysql·golang·软件工程·tidb
presenttttt1 小时前
用Python和OpenCV从零搭建一个完整的双目视觉系统(五)
开发语言·python·opencv·计算机视觉
kk_stoper1 小时前
使用Ruby接入实时行情API教程
java·开发语言·javascript·数据结构·后端·python·ruby
小李飞飞砖2 小时前
kotlin
开发语言·单例模式·kotlin
小李飞飞砖2 小时前
kotlin中的冷流和热流
android·开发语言·kotlin
弹简特2 小时前
【Java SE】Arrays工具类
java·开发语言