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,缓存区应该是有数值的,此时是用来读取其中的内容。

相关推荐
kkeeper~1 天前
0基础C语言积跬步之深入理解指针(5下)
c语言·开发语言
一直不明飞行1 天前
Java的equals(),hashCode()应该在什么时候重写
java·开发语言·jvm
盲敲代码的阿豪1 天前
Python 入门基础教程(爬虫前置版)
开发语言·爬虫·python
basketball6161 天前
C++ 构造函数完全指南:从入门到进阶
java·开发语言·c++
互联科技报1 天前
2026超融合选型:Top5品牌与市场格局解读
开发语言·perl
weixin199701080161 天前
[特殊字符] 智能数据采集:数字化转型的“数据石油勘探队”(附Python实战源码)
开发语言·python
想唱rap1 天前
IO多路转接之poll
服务器·开发语言·数据库·c++
@杰克成1 天前
Java学习30
java·开发语言·学习
三品吉他手会点灯1 天前
C语言学习笔记 - 40.数据类型 - scanf函数的编程规范与非法输入处理
c语言·开发语言·笔记·学习
凯瑟琳.奥古斯特1 天前
数据冗余与规范化的本质[数据库原理]
开发语言·数据库·职场和发展