美文网首页
go标准库:bufio

go标准库:bufio

作者: PhilicX | 来源:发表于2020-03-23 15:38 被阅读0次

Reader类

bufio.Reader包装了一个io.Reader对象,提供与io.Reader一致的接口,实现了带有缓冲区的Reader功能

数据结构

type Reader struct {
    buf          []byte
    rd           io.Reader // reader provided by the client
    r, w         int       // buf read and write positions
    err          error
    lastByte     int // last byte read for UnreadByte; -1 means invalid
    lastRuneSize int // size of last rune read for UnreadRune; -1 means invalid
}

构造器

bufio.go中定义了最小buffer大小minReadBufferSize=16,当传入size小于此值时会被忽略

func NewReaderSize(rd io.Reader, size int) *Reader
func NewReader(rd io.Reader) *Reader

接口

Size() int
Buffered() int
  • Size返回buffer的总长度
  • Buffered根据r, w指针计算出实际被缓冲的字节数
Reset(r io.Reader)
  • 用给定的io.Reader将缓冲区初始化
Peek(n int) ([]byte, error)
Discard(n int) (discarded int, error)
  • Peek()方法尝试获得一个当前缓冲区的n个字节的引用,如果缓冲区内字节不足,会报错,而不会从reader中读;线程不安全
  • Discard()方法尝试“跳过”缓冲区的n个字节,而不触动reader;如果缓冲区内字节数小于n,此操作仅会清空所有缓冲区,并返回实际跳过的字节数和error
ReadByte() (byte, error)
Read(p []byte) (n int, error)
UnreadByte() error
  • ReadByte从缓冲区里读一个字节,并更新相应状态;如果缓冲区不足,会先进行填充
  • Read读多个字节
  • UnreadByte退回一个字节;Unread方法无法连续使用
ReadRune() (r rune, size int, error)
UnreadRune() error
  • ReadRune读一个UTF8字符,并且返回其字节大小
  • UnreadRune如果被调用,必须紧挨着ReadRune
ReadSlice(delim byte) (line []byte, error)
ReadLine() (line []byte, isPrefix bool, error)
ReadBytes(delim byte) ([]byte, error)
ReadString(delim byte) (string, error)
  • ReadSlice持续从reader中读字节直到读到delim,返回的是对buffer的引用
  • ReadLine以'\n'作为delim的ReadSlice,特别地对“\r\n” 的情况进行了处理
  • ReadBytes返回的是新创建的bytes数组(区别于ReadSlice)
  • ReadString返回的是bytes转化后的string
WriteTo(w io.Writer) (n int64, error)
  • 实现了io.WriteTo接口

Writer类

bufio.Writer类实现了一个带有缓冲区的io.Writer
如果写入到Writer时发生错误,所有后续写入和刷新都会被拒绝并返回错误
在使用此Writer时,应在完成全部写入后调用Flush以保证所有数据都正确地传入了下一层的io.Writer

数据结构

type Writer struct {
    err error
    buf []byte
    n   int          // 相比于Reader,此处只需要一个尾指针
    wr  io.Writer
}

构造器

NewWriterSize(w io.Writer, size int) *Writer
NewWriter(w io.Writer) *Writer
  • size指定了缓冲区的大小

接口

Size() int
Buffered() int
Available() int
  • 分别为 len(buf), n, len(buf) - n
Write(p []byte) (nn int, err error)
WriteByte(c byte) error
WriteRune(r rune) (size int, err error)
WriteString(s string) (int, error)
  • 所有写操作的基本思路都是先尝试复制到buf,如果buf满,则刷入到io.Writer
  • 如果准备写入的内容大于buf容量,则跳过缓冲直接刷入io.Writer
Flush()
  • 尝试将buf中的内容写入到io.Writer中,如果出错,则将未成功写入的部分复制回buf
ReadFrom(r io.Reader) (n int64, err error)
  • 实现了io.ReaderFrom接口

ReadWriter类

包含一个bufio.Reader和一个bufio.Writer的指针,实现了io.ReadWriter

相关文章

  • go标准库:bufio

    Reader类 bufio.Reader包装了一个io.Reader对象,提供与io.Reader一致的接口,实现...

  • golang中bufio包

    一、介绍go标准库中的bufio最近用golang写了一个处理文件的脚本,由于其中涉及到了文件读写,开始使用gol...

  • Golang标准库——bufio

    bufio bufio包实现了有缓冲的I/O。它包装一个io.Reader或io.Writer接口对象,创建另一个...

  • golang学习资源

    教程类 Go 标准库中文文档 Go 标准库文档 Go 实例学标准库 Go入门指南The-way-to-go Go语...

  • Go bufio

    bufio通过缓存来提高效率,缓存放在主存中。 Golang的bufio包实现了带缓存的I/O读写操作,用来帮助处...

  • 22 Go 常用标准库简析

    Go 常用标准库 Go官方以包的形式提供功能丰富的标准库,了解这些包会让你在项目开发中如鱼得水。Go标准库很容易理...

  • Go 标准库介绍六: log

    Go 标准库介绍六: log 原文链接 http://ironxu.com/775 本文介绍Go 标准库 log ...

  • Golang io reader writer

    推荐阅读Go语言小贴士1 - io包Go语言小贴士2 - 协议解析Go语言小贴士3 - bufio包 一、《GO语...

  • Go 标准库中文文档

    Go标准库中文文档

  • Go语言入门【五】:源码学习-bufio

    介绍 package bufio也是io的一部分,但在不同包中,因此独立一节。其中包含bufio.go,scan....

网友评论

      本文标题:go标准库:bufio

      本文链接:https://www.haomeiwen.com/subject/rkniyhtx.html