bufio标准库中的Reader和Writer,最好用于文件IO操作,把数据先缓存到内存中,然后再整体做文件IO操作,尽最大可能地减少磁盘IO,但是内存缓冲区的大小要合理设置,默认大小是4096个字节。
bufio.Writer使用
bufio标准库中的Writer提供的方法列表
type Writer struct {
err error
buf []byte
n int
wr io.Writer
}
// 实例化bufio.Writer, 实例化是会直接分配大小为len(w.buf)大小的内存空间,Writer.n表示内存缓冲区已经存放的字节大小
func NewWriter(w io.Writer) *Writer
func NewWriterSize(w io.Writer, size int) *Writer
// 表示可用的内存缓冲区大小len(b.buf)-n
func (b *Writer) Avaliable() int
// 表示已使用的内存缓冲区大小b.n
func (b *Writer) Buffered() int
// 这个首字母大写,表示用户可以手动触发内存缓冲区的数据,回写到wr.Write所指定的地方,一般为磁盘IO回写
func (b *Writer) Flush() error
// bufio.Writer把数据写到缓冲区挺有意思的。
// 开发者可以阅读源码了解一下。我举第二个方法Write([]byte)
func (b *Writer) ReadFrom(r io.Reader) (int64, error)
func (b *Writer) Write(p []byte) (int, error)
func (b *Writer) WriteByte(c byte) error
func (b *Writer) WriteRune(r rune) (int, error)
func (b *Writer) WriteString(s string) (int, error)
对于func (b *Writer) Write(p []byte) (int, error)
方法的正确理解:
- 如果内存缓冲区剩余空间小于len(p),分两种情况讨论:
- 如果当前内存缓冲区为空,则直接把p数据写入到磁盘IO,b.wr.Write(p);
- 如果当前内存缓冲区不空,则首先把缓冲区填满,然后先把内存缓冲区的数据进行一次磁盘IO回写操作,之后内存缓冲区可用大小有是len(Writer.buf)长度了,这时又分两种情况讨论:
第一种:如果剩余要处理的p数据小于内存缓冲区的大小, 则把剩余数据p写入到内存缓冲区;第二种:如果剩余要处理的p数据大于等于内存缓冲区,则没必要缓冲了,直接整体一次回写到磁盘
。
- 如果内存缓冲区剩余空间大于等于len(p), 则先把数据暂存到缓冲区,减少磁盘IO。
总结:bufio的Reader和Writer操作一般适用于磁盘IO的读写场景。同时了解标准库的实现, 可以提高自己的编程思维。标准库bufio确实写得很有意思。
有疑问加站长微信联系(非本文作者)