读取缓冲区 Reader
创建读取对象
- NewReader 创建默认大小的缓冲区
- NewReaderSize 创建指定大小的缓冲区
- Reader.Buffered 获取缓存可读取字节数
- Reset 丢弃当期缓存数据, 所以丢弃的长度与缓冲区大小相关
if f, err := os.OpenFile("./mock.json", os.O_RDWR, os.ModelAppend); err == nil{
// 创建缓冲区
buf := bufio.NewReader(f)
// 创建指定大小buff
// bufCache := bufio.NewReaderSize(f, 50)
// 获取当前缓冲区可读字节数
fmt.Printf("\n %d \n", bufCache.Buffered())
}
读取缓冲数据
- Reader.Read 将数据存入[]byte 中
- Reader. ReadByte 获取缓冲区中的一个字节
- Reader.ReadBytes 获取到制定断点的字节
- Reader.ReadString 获取到指定断点的字符串
// 需要为 []byte 字节切片开创内存空间
cache := make([]byte, 100)
// 将读取数据存入, 字节切片中. 返回读取数及错误信息
num, _ := bufCache.Read(cache)
fmt.Printf("\n%d: %s", num, string(cache))
f, _ := os.OpenFile("./mock.json", os.O_RDWR, os.ModeAppend)
bufCache := bufio.NewReaderSize(f, 1)
//以换行符为断点,读取数据
var str string
var buf []byte
var err error
for err == nil {
buf, err = bufCache.ReadBytes('\n')
fmt.Println("from buff: ", string(buf))
// 直接读取字符串
str, err = bufCache.ReadString('\n')
fmt.Println("from string: ", str)
}
// 主要:因为使用的是同一缓冲区, 无论使用哪种读取方法,都将影响下次读取。
写入缓冲区 Writer
新建缓冲区
- NewWriter 创建默认大小缓冲区
- NewWriterSize 创建指定大小缓冲区
- Writer.Reset 丢弃当前缓冲区数据
- Writer.Buffered 获取缓冲区已使用字节数
- Writer.Available 获取缓冲区可用字节数
f, _ := os.OpenFile("./mock.json", os.O_RDWR, os.ModeAppend)
// 创建缓冲区
writerBuff := bufio.NewWriter(f)
dataSize := writerBuff.Buffered()
surplus := writerBuff.Available()
fmt.Println(dataSize, surplus)
写入数据
- Writer.Write 缓冲区 写入[]byte
- Writer.WriteString 缓冲区 写入字符
- Writer.WriteByte 缓冲区 写入单一字节
- Writer.Flush 将缓冲区数据写入 io.Writer接口
- Writer.ReadFrom 从读取接口(io.Reader) 写入数据
// 逐行读取,转为大写
func main() {
srouce, _ := os.OpenFile("./srouce.json", os.O_RDWR, os.ModeAppend)
target, _ := os.OpenFile("./target.json", os.O_RDWR, os.ModeAppend)
readerBuff := bufio.NewReader(srouce)
writerBuff := bufio.NewWriter(target)
var num int
var str string
var err error
for err == nil {
// 逐行读取
str, err = readerBuff.ReadString('\n')
fmt.Printf("\n%d %s", num, str)
num++
// 逐行写入
writerBuff.WriteString(strings.ToUpper(str))
// 提交写入
writerBuff.Flush()
}
}
// 拷贝文件内容
srouce, _ := os.OpenFile("./mock.json", os.O_RDWR, os.ModeAppend)
target, _ := os.OpenFile("./target.json", os.O_RDWR, os.ModeAppend)
writerBuff := bufio.NewWriter(target)
// 从 io.Reader 直接获取数据
writerBuff.ReadFrom(srouce)
可读写缓冲区
该缓冲区是 Reader Writer 接口集合对象 { *Reader, *Writer }
- NewReadWriter 创建可读写缓冲区
Scanner
带处理函数的缓冲区
Scanner 方法
- NewScanner 创建 Scanner
- Scanner.Split 设置处理函数
- Scanner.Scan 获取当前token, 扫描下一token
- Scanner.Bytes 将token以 []byte 的形式返回
- Scanner.Text 将token以 string 的形式返回
- Scanner.Err 获取处理方法返回的错误
package main
import (
"bufio"
"fmt"
"os"
)
func main() {
// 将标准输入作为数据源
scanner := bufio.NewScanner(os.Stdin)
// 设置处理函数
scanner.Split(bufio.ScanLines)
for scanner.Scan() {
// 以字符串形式输出
fmt.Println(scanner.Text())
}
}
bufio 默认 Scanner 处理方法
- ScanBytes 将token处理为单一字节
- ScanRunes 将token处理为utf-8编码的unicode码
- ScanWords 以空格分隔token
- ScanLines 以换行符分分割token
网友评论