go标准库:bufio

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)