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