github.com/code-reading/golang@v0.0.0-20220303082512-ba5bc0e589a3/go/src/bufio/bufio.go (about) 1 // Copyright 2009 The Go Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 // Package bufio implements buffered I/O. It wraps an io.Reader or io.Writer 6 // object, creating another object (Reader or Writer) that also implements 7 // the interface but provides buffering and some help for textual I/O. 8 // bufio 包实现了带缓存的 I/O 操作 9 // 它封装一个 io.Reader 或 io.Writer 对象 10 // 使其具有缓存和一些文本读写功能 11 package bufio 12 13 import ( 14 "bytes" 15 "errors" 16 "io" 17 "strings" 18 "unicode/utf8" 19 ) 20 21 const ( 22 defaultBufSize = 4096 // 默认4kb 23 ) 24 25 var ( 26 ErrInvalidUnreadByte = errors.New("bufio: invalid use of UnreadByte") 27 ErrInvalidUnreadRune = errors.New("bufio: invalid use of UnreadRune") 28 ErrBufferFull = errors.New("bufio: buffer full") 29 ErrNegativeCount = errors.New("bufio: negative count") 30 ) 31 32 // Buffered input. 33 34 // Reader implements buffering for an io.Reader object. 35 type Reader struct { 36 buf []byte // 缓存 37 rd io.Reader // reader provided by the client 底层的io.Reader 38 // r: 从buf中读走的字节(偏移); w:buf 中填充内容的偏移 39 // w -r 是buf中可被读的长度(缓存数据的大小), 也是Buffered()方法的返回值 40 r, w int // buf read and write positions 41 err error // 读过程中遇到的错误 42 // 最后一次读到的字节 43 lastByte int // last byte read for UnreadByte; -1 means invalid 44 // 最后一次读到Rune的大小 45 lastRuneSize int // size of last rune read for UnreadRune; -1 means invalid 46 } 47 48 const minReadBufferSize = 16 49 const maxConsecutiveEmptyReads = 100 50 51 // NewReaderSize returns a new Reader whose buffer has at least the specified 52 // size. If the argument io.Reader is already a Reader with large enough 53 // size, it returns the underlying Reader. (基础reader) 54 // 初始化Reader size 55 // 如果rd 是reader 且其buf 大于要设置的size 则直接返回 56 // 否则 检测 最小读buf size 57 // 否则 new 一个新的Reader 并为其设置size 58 59 // 可以根据实际情况 初始化一个合适size的Reader 60 func NewReaderSize(rd io.Reader, size int) *Reader { 61 // Is it already a Reader? 62 b, ok := rd.(*Reader) 63 if ok && len(b.buf) >= size { 64 return b 65 } 66 if size < minReadBufferSize { 67 size = minReadBufferSize 68 } 69 r := new(Reader) 70 r.reset(make([]byte, size), rd) 71 return r 72 } 73 74 // NewReader returns a new Reader whose buffer has the default size. 75 // new 一个Reader 默认bufsize 是 4kb 76 // 不知道要多大的reader时 可以直接用这个,默认4kb大小, 一般时一个页的大小 77 // 弊端是 在某些情况下可能太大浪费内存或者太小不够用, 78 // 最好还是使用NewReaderSize根据情况自定义缓存大小。 79 func NewReader(rd io.Reader) *Reader { 80 return NewReaderSize(rd, defaultBufSize) 81 } 82 83 // Size returns the size of the underlying buffer in bytes. 84 func (b *Reader) Size() int { return len(b.buf) } 85 86 // Reset discards any buffered data, resets all state, and switches 87 // the buffered reader to read from r. 88 // 丢失buffered 数据, 重置reader所有状态, 并将缓存切换到r 89 // 这里丢弃buffered 数据不是清空buf 而是设置lastByte 和 lastRuneSize 为非法位置 90 /* 91 package main 92 93 import ( 94 "bufio" 95 "fmt" 96 "strings" 97 ) 98 99 func main() { 100 s := strings.NewReader("ABCEFG") 101 str := strings.NewReader("123455") 102 br := bufio.NewReader(s) 103 b, _ := br.ReadString('\n') 104 fmt.Println(b) //ABCEFG 105 br.Reset(str) 106 b, _ = br.ReadString('\n') 107 fmt.Println(b) //123455 108 } 109 */ 110 func (b *Reader) Reset(r io.Reader) { 111 b.reset(b.buf, r) 112 } 113 114 func (b *Reader) reset(buf []byte, r io.Reader) { 115 *b = Reader{ 116 buf: buf, 117 rd: r, 118 lastByte: -1, 119 lastRuneSize: -1, 120 } 121 } 122 123 var errNegativeRead = errors.New("bufio: reader returned negative count from Read") 124 125 // fill reads a new chunk into the buffer. 126 // 读取一块数据到buffer中 127 // fill()把剩余未读长度的数据复制到缓存头部并且r重置为0,相当于把未读数据移动到头部。 128 // 同时尽量从io中读取数据写入缓存,有可能不能写满。 129 func (b *Reader) fill() { 130 // Slide existing data to beginning. 131 if b.r > 0 { // 把buf剩余可读的数据复制到最前面 132 copy(b.buf, b.buf[b.r:b.w]) 133 b.w -= b.r 134 b.r = 0 135 } 136 137 if b.w >= len(b.buf) { // 缓存已经溢出 138 panic("bufio: tried to fill full buffer") 139 } 140 // maxConsecutiveEmptyReads = 100 141 // 最大连续空读次数100次 142 // Read new data: try a limited number of times. 143 for i := maxConsecutiveEmptyReads; i > 0; i-- { 144 n, err := b.rd.Read(b.buf[b.w:]) // 从io中读取数据并写入缓存buffer中 145 if n < 0 { 146 panic(errNegativeRead) 147 } 148 b.w += n // 更新写入缓存的长度 149 if err != nil { 150 b.err = err 151 return 152 } 153 if n > 0 { 154 return 155 } // n == 0时 会循环尝试从io中读取, 最多100次 156 } 157 b.err = io.ErrNoProgress // 读取了100次, n都为0 158 } 159 160 func (b *Reader) readErr() error { 161 err := b.err 162 b.err = nil 163 return err 164 } 165 166 // Peek returns the next n bytes without advancing the reader. The bytes stop 167 // being valid at the next read call. If Peek returns fewer than n bytes, it 168 // also returns an error explaining why the read is short. The error is 169 // ErrBufferFull if n is larger than b's buffer size. 170 // 171 // Calling Peek prevents a UnreadByte or UnreadRune call from succeeding 172 // until the next read operation. 173 // Peek 直接返回n字节内容并不会写入到reader中 174 // 在下一次read 调用前 引用的bytes是有效的, 因为read后会修改游标; 175 // 如果Peek返回的字节数小于n, 会同时返回一条error说明原因 176 // 如果 n 比缓存的buffer size 还要大 则会返回一个ErrBufferFull 错误 177 // Peek 可以使得后继UnreadByte和UnReadRune调用, 直到下一次read操作 178 /* 179 Peek 180 1.判断当前缓存数据小于要读取的n字节, 并且缓存没有满 且没有报错 则先去从io中读取数据到缓存 181 2.如果读取的n自己大于缓存, 则返回缓存数据并报ErrBufferFull错误 182 3.如果缓存数据不够, 则返回可能的缓存数据并报ErrBufferFull 183 4.如果要读取的n比缓存小, 且有足够的缓存数据, 则返回对应的缓存数据,不报错; 184 185 186 不管怎样都会返回缓存可读取的切片但是没有移动读游标,修改返回的切片会影响缓存中的数据。 187 188 Peek返回错误不为空时,一种情况是你Peek的长度比缓存都大,那么数据永远不够,所以传入参数时要注意别比缓存大。 189 别一种情况是,从io里尝试读数据了但还是准备不够你需要的长度,比如网络tcp的数据一开始没有到达,等下一轮你再调用Peek时可能缓存就足够你读了。 190 其实就算有错误也会返回你可读取的切片。 191 如果错误为空,恭喜你,数据都准备好啦。 192 Peek不会移动读游标,如果直接使用Peek返回的切片可以配合Discard来跳过指定字节的数据不再读取也就是移动读游标。 193 194 Peek 返回缓存中前n个字节的切片, 并不会修改游标, 所以在读取缓存 这些数据还是可以读取的,如果修改了Peek返回的字节切片 195 那么缓存中对应的数据也会被修改 196 通过Peek 返回的值 可以修改缓存中的数据, 但是不能修改底层io.Reader中的数据 197 198 func main() { 199 s := strings.NewReader("ABCDEFG") 200 br := bufio.NewReader(s) 201 202 b, _ := br.Peek(5) 203 fmt.Printf("%s\n", b) 204 // ABCDE 205 206 b[0] = 'a' 207 b, _ = br.Peek(5) 208 fmt.Printf("%s\n", b) 209 // aBCDE 210 } 211 212 */ 213 // 只是“窥探”一下 Reader 中没有读取的 n 个字节。好比栈数据结构中的取栈顶元素,但不出栈。 214 func (b *Reader) Peek(n int) ([]byte, error) { 215 if n < 0 { 216 return nil, ErrNegativeCount 217 } 218 // 初始化 最后一次读取字节的位置和runesize 为invalid 219 b.lastByte = -1 220 b.lastRuneSize = -1 221 222 // b.w-b.r < n 缓存小于读取的n字节 223 // b.w-b.r < len(b.buf) 缓存小于reader的buf大小 224 // 且 reader 没有报错 225 // 则 直接调用fill() 先填充buffer 226 // 剩余可读小于n而且小于缓存时从io里fill数据到缓存 227 for b.w-b.r < n && b.w-b.r < len(b.buf) && b.err == nil { 228 b.fill() // b.w-b.r < len(b.buf) => buffer is not full 229 } 230 // 如果 n 要大于 reader 的buffer大小 231 if n > len(b.buf) { 232 return b.buf[b.r:b.w], ErrBufferFull // 直接返回全部缓存数据, 并且返回ErrBufferFull 233 } 234 235 // 0 <= n <= len(b.buf) n 小于reader 缓存大小 236 var err error 237 if avail := b.w - b.r; avail < n { // 当前缓存数据小于读取的n字节 238 // not enough data in buffer 239 n = avail 240 err = b.readErr() 241 if err == nil { 242 err = ErrBufferFull // 如果reader 没有错 则报ErrBufferFull 243 } 244 } 245 return b.buf[b.r : b.r+n], err // 返回可能的缓存数据, 并说明原因 246 } 247 248 // Discard skips the next n bytes, returning the number of bytes discarded. 249 // 250 // If Discard skips fewer than n bytes, it also returns an error. 251 // If 0 <= n <= b.Buffered(), Discard is guaranteed to succeed without 252 // reading from the underlying io.Reader. 253 // 跳过n个字节不读取 254 func (b *Reader) Discard(n int) (discarded int, err error) { 255 if n < 0 { 256 return 0, ErrNegativeCount 257 } 258 if n == 0 { 259 return 260 } 261 remain := n 262 for { 263 skip := b.Buffered() // 返回当前缓存中可读缓存数据的长度 264 if skip == 0 { 265 b.fill() // 从io中读取数据到缓存 266 skip = b.Buffered() // 再次读取这个长度 267 } 268 if skip > remain { // 如果长度大于要读取的remain 则设置为remain 269 skip = remain 270 } 271 b.r += skip // 修改游标,这里为什么不能直接修改为 b.r +=remain ? 272 remain -= skip // 修改剩余要丢弃的字节数目 273 if remain == 0 { 274 return n, nil 275 } 276 // 如果要丢弃的字节数大于所有的缓存数据, 则会报错 277 // 注意此时b.r的游标也修改为最后的数据位置了 278 // 返回 n - remain 已经丢弃的数据位置 279 if b.err != nil { 280 return n - remain, b.readErr() 281 } 282 } 283 } 284 285 // Read reads data into p. 286 // It returns the number of bytes read into p. 287 // The bytes are taken from at most one Read on the underlying Reader, 288 // hence n may be less than len(p). 289 // To read exactly len(p) bytes, use io.ReadFull(b, p). 290 // At EOF, the count will be zero and err will be io.EOF. 291 // 将缓存数据读取到字节数组中 292 // 返回读取的字节长度, 没有数据会返回 EOF 293 // 注意 len(p) 可能会大于 返回的n 大小 294 // 如果需要精确读取len(p) 可以使用io.ReadFull(b,p) 295 /* 296 Read 具体逻辑 297 1.检测待装数据的字节数组长度, 如果为0 则直接返回 298 2.检测缓存中是否有数据可以读取, 如果没有, 299 2.1 如果p的空间大于缓存的空间, 则直接从io中读取数据到p中并返回; 300 2.2 否则先读取数据到缓存中; 301 3.将缓存中的数据读取到p中并返回; 302 3.如果缓存中有数据则不会去读取io中的数据; 303 304 p的空间有可能被填满,也有可能不满,返回的n说明读取了多少个字节。 305 Read尽量先从缓存中读取数据。当前缓存无数据可读时先从io中读取填充到缓存里, 306 然后从缓存中复制。返回读取到的数据长度不一定,小于或者等于Read要求的长度。 307 308 // Read 从 b 中读出数据到 p 中,返回读出的字节数 309 // 如果 p 的大小 >= 缓存的总大小,而且缓存不为空 310 // 则只能读出缓存中的数据,不会从底层 io.Reader 中提取数据 311 // 如果 p 的大小 >= 缓存的总大小,而且缓存为空 312 // 则直接从底层 io.Reader 向 p 中读出数据,不经过缓存 313 // 只有当 b 中无可读数据时,才返回 (0, io.EOF) 314 315 func main() { 316 s := strings.NewReader("ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890") 317 br := bufio.NewReader(s) 318 b := make([]byte, 20) 319 320 n, err := br.Read(b) 321 fmt.Printf("%-20s %-2v %v\n", b[:n], n, err) 322 // ABCDEFGHIJKLMNOPQRST 20 <nil> 323 324 n, err = br.Read(b) 325 fmt.Printf("%-20s %-2v %v\n", b[:n], n, err) 326 // UVWXYZ1234567890 16 <nil> 327 328 n, err = br.Read(b) 329 fmt.Printf("%-20s %-2v %v\n", b[:n], n, err) 330 // 0 EOF 331 } 332 */ 333 func (b *Reader) Read(p []byte) (n int, err error) { 334 n = len(p) 335 if n == 0 { 336 if b.Buffered() > 0 { 337 return 0, nil 338 } 339 return 0, b.readErr() 340 } 341 if b.r == b.w { // 缓存中无数据可以读取 342 if b.err != nil { // 查看是否报错 343 return 0, b.readErr() 344 } 345 if len(p) >= len(b.buf) { // p的空间大于等于缓存 346 // Large read, empty buffer. 347 // Read directly into p to avoid copy. 348 n, b.err = b.rd.Read(p) // 直接从io中把数据读取到p中 349 if n < 0 { 350 panic(errNegativeRead) 351 } 352 if n > 0 { 353 b.lastByte = int(p[n-1]) 354 b.lastRuneSize = -1 355 } 356 return n, b.readErr() 357 } 358 // One read. 359 // Do not use b.fill, which will loop. 360 // 无数据可以读取, 表示buf中数据无用了则重置r和w的游标 361 b.r = 0 362 b.w = 0 363 n, b.err = b.rd.Read(b.buf) // 从io中读取到缓存 364 if n < 0 { 365 panic(errNegativeRead) 366 } 367 if n == 0 { 368 return 0, b.readErr() 369 } 370 b.w += n // 更新缓存写入了多少数据 371 } 372 373 // copy as much as we can 374 n = copy(p, b.buf[b.r:b.w]) //赋值缓存中的数据到p中 375 b.r += n // 读了多少 376 b.lastByte = int(b.buf[b.r-1]) 377 b.lastRuneSize = -1 378 return n, nil 379 } 380 381 // ReadByte reads and returns a single byte. 382 // If no byte is available, returns an error. 383 // ReadByte 从 b 中读出一个字节并返回 384 // 如果 b 中无可读数据,则返回一个错误 385 func (b *Reader) ReadByte() (byte, error) { 386 b.lastRuneSize = -1 387 for b.r == b.w { 388 if b.err != nil { // 如果err 不为nil 读取err ,原err设置为nil 389 return 0, b.readErr() 390 } 391 b.fill() // buffer is empty 392 } 393 c := b.buf[b.r] // 读取一个字节 394 b.r++ // read加一 395 b.lastByte = int(c) 396 return c, nil 397 } 398 399 // UnreadByte unreads the last byte. Only the most recently read byte can be unread. 400 // 401 // UnreadByte returns an error if the most recent method called on the 402 // Reader was not a read operation. Notably, Peek is not considered a 403 // read operation. 404 // UnreadByte 撤消最后一次读出的字节 405 // 只有最后读出的字节可以被撤消 406 // 无论任何操作,只要有内容被读出,就可以用 UnreadByte 撤消一个字节 407 /* 408 func main() { 409 s := strings.NewReader("ABCDEFG") 410 br := bufio.NewReader(s) 411 412 c, _ := br.ReadByte() 413 fmt.Printf("%c\n", c) 414 // A 415 416 c, _ = br.ReadByte() 417 fmt.Printf("%c\n", c) 418 // B 419 420 br.UnreadByte() 421 c, _ = br.ReadByte() 422 fmt.Printf("%c\n", c) 423 // B 424 } 425 */ 426 func (b *Reader) UnreadByte() error { 427 if b.lastByte < 0 || b.r == 0 && b.w > 0 { // 如果读已经是0 并且已经再写了 则没法撤销了 428 return ErrInvalidUnreadByte 429 } 430 // b.r > 0 || b.w == 0 431 if b.r > 0 { // 读取大于0 直接撤销 432 b.r-- 433 } else { // 如果读写都为0 则写加一 434 // b.r == 0 && b.w == 0 435 b.w = 1 436 } 437 b.buf[b.r] = byte(b.lastByte) // 写入最后一次字节 438 b.lastByte = -1 439 b.lastRuneSize = -1 440 return nil 441 } 442 443 // ReadRune reads a single UTF-8 encoded Unicode character and returns the 444 // rune and its size in bytes. If the encoded rune is invalid, it consumes one byte 445 // and returns unicode.ReplacementChar (U+FFFD) with a size of 1. 446 // ReadRune 从 b 中读出一个 UTF8 编码的字符并返回 447 // 同时返回该字符的 UTF8 编码长度 448 // 如果 UTF8 序列无法解码出一个正确的 Unicode 字符 449 // 则只读出 b 中的一个字节,并返回 U+FFFD 字符,size 返回 1 450 /* 451 func main() { 452 s := strings.NewReader("你好,世界!") 453 br := bufio.NewReader(s) 454 455 c, size, _ := br.ReadRune() 456 fmt.Printf("%c %v\n", c, size) 457 // 你 3 458 459 c, size, _ = br.ReadRune() 460 fmt.Printf("%c %v\n", c, size) 461 // 好 3 462 463 br.UnreadRune() 464 c, size, _ = br.ReadRune() 465 fmt.Printf("%c %v\n", c, size) 466 // 好 3 467 } 468 */ 469 func (b *Reader) ReadRune() (r rune, size int, err error) { 470 // 注意这里是一个循环, 每次都装数据到缓存buf中 471 for b.r+utf8.UTFMax > b.w && !utf8.FullRune(b.buf[b.r:b.w]) && b.err == nil && b.w-b.r < len(b.buf) { 472 b.fill() // b.w-b.r < len(buf) => buffer is not full 473 } 474 b.lastRuneSize = -1 475 if b.r == b.w { 476 return 0, 0, b.readErr() 477 } 478 r, size = rune(b.buf[b.r]), 1 479 if r >= utf8.RuneSelf { 480 r, size = utf8.DecodeRune(b.buf[b.r:b.w]) 481 } 482 b.r += size 483 b.lastByte = int(b.buf[b.r-1]) 484 b.lastRuneSize = size // 标志读取的rune size, 可用于 UnreadRune() 撤销 485 return r, size, nil 486 } 487 488 // UnreadRune unreads the last rune. If the most recent method called on 489 // the Reader was not a ReadRune, UnreadRune returns an error. (In this 490 // regard it is stricter than UnreadByte, which will unread the last byte 491 // from any read operation.) 492 // UnreadRune 撤消最后一次读出的 Unicode 字符 493 // 如果最后一次执行的不是 ReadRune 操作,则返回一个错误 494 // 因此,UnreadRune 比 UnreadByte 更严格 495 func (b *Reader) UnreadRune() error { 496 if b.lastRuneSize < 0 || b.r < b.lastRuneSize { 497 return ErrInvalidUnreadRune 498 } 499 b.r -= b.lastRuneSize 500 b.lastByte = -1 501 b.lastRuneSize = -1 502 return nil 503 } 504 505 // Buffered returns the number of bytes that can be read from the current buffer. 506 // 返回当前缓存中缓存数据的长度 507 /* 508 func main() { 509 s := strings.NewReader("你好,世界!") 510 br := bufio.NewReader(s) 511 512 fmt.Println(br.Buffered()) 513 // 0 514 515 br.Peek(1) // 通过触发fill() 填充缓存 516 fmt.Println(br.Buffered()) 517 // 18 518 } 519 */ 520 func (b *Reader) Buffered() int { return b.w - b.r } 521 522 // ReadSlice reads until the first occurrence of delim in the input, 523 // returning a slice pointing at the bytes in the buffer. 524 // The bytes stop being valid at the next read. 525 // If ReadSlice encounters an error before finding a delimiter, 526 // it returns all the data in the buffer and the error itself (often io.EOF). 527 // ReadSlice fails with error ErrBufferFull if the buffer fills without a delim. 528 // Because the data returned from ReadSlice will be overwritten 529 // by the next I/O operation, most clients should use 530 // ReadBytes or ReadString instead. 531 // ReadSlice returns err != nil if and only if line does not end in delim. 532 533 // ReadSlice 在 b 中查找 delim 并返回 delim 及其之前的所有数据的切片 534 // 该操作会读出数据,返回的切片是已读出数据的引用 535 // 切片中的数据在下一次读取操作之前是有效的 536 // 537 // 如果 ReadSlice 在找到 delim 之前遇到错误 538 // 则读出缓存中的所有数据并返回,同时返回遇到的错误(通常是 io.EOF) 539 // 如果在整个缓存中都找不到 delim,则 err 返回 ErrBufferFull 540 // 如果 ReadSlice 能找到 delim,则 err 始终返回 nil 541 // 542 // 因为返回的切片中的数据有可能被下一次读写操作修改 543 // 因此大多数操作应该使用 ReadBytes 或 ReadString,它们返回的不是数据引用 544 545 // ReadSlice 会把数据读取出来, 之后缓存中没有这个数据了 546 // ReadSlice 可供用户指定分隔符读取, 每次都是搜索到第一次遇到delim结束 547 /* 548 func main() { 549 s := strings.NewReader("ABC DEF GHI JKL") 550 br := bufio.NewReader(s) 551 552 w, _ := br.ReadSlice(' ') 553 fmt.Printf("%q\n", w) 554 // "ABC " 555 556 w, _ = br.ReadSlice(' ') 557 fmt.Printf("%q\n", w) 558 // "DEF " 559 560 w, _ = br.ReadSlice(' ') 561 fmt.Printf("%q\n", w) 562 // "GHI " 563 } 564 */ 565 func (b *Reader) ReadSlice(delim byte) (line []byte, err error) { 566 s := 0 // search start index 567 for { 568 // Search buffer. 569 if i := bytes.IndexByte(b.buf[b.r+s:b.w], delim); i >= 0 { // i > 0 表示找到了 570 i += s 571 line = b.buf[b.r : b.r+i+1] // 读取delim 之前的数据到line中, 注意line 是[]byte 572 b.r += i + 1 // 修改了读的游标 573 break 574 } 575 576 // Pending error? 577 if b.err != nil { 578 line = b.buf[b.r:b.w] // 有错误 返回所有缓存数据 579 b.r = b.w // 设置游标到写的位置,表示缓存中没有数据了 580 err = b.readErr() // 读取错误, 并重置b的错误为nil 581 break 582 } 583 584 // Buffer full? 585 if b.Buffered() >= len(b.buf) { // 如果缓存数据大于 b的缓存大小 586 b.r = b.w 587 line = b.buf // 直接返回 line = b.buf 588 err = ErrBufferFull 589 break 590 } 591 592 s = b.w - b.r // do not rescan area we scanned before 593 594 b.fill() // buffer is not full 595 } 596 597 // Handle last byte, if any. 598 if i := len(line) - 1; i >= 0 { 599 b.lastByte = int(line[i]) // 记录最后一个byte, 可用于unReadByte 600 b.lastRuneSize = -1 601 } 602 603 return 604 } 605 606 // ReadLine is a low-level line-reading primitive. Most callers should use 607 // ReadBytes('\n') or ReadString('\n') instead or use a Scanner. 608 // 609 // ReadLine tries to return a single line, not including the end-of-line bytes. 610 // If the line was too long for the buffer then isPrefix is set and the 611 // beginning of the line is returned. The rest of the line will be returned 612 // from future calls. isPrefix will be false when returning the last fragment 613 // of the line. The returned buffer is only valid until the next call to 614 // ReadLine. ReadLine either returns a non-nil line or it returns an error, 615 // never both. 616 // 617 // The text returned from ReadLine does not include the line end ("\r\n" or "\n"). 618 // No indication or error is given if the input ends without a final line end. 619 // Calling UnreadByte after ReadLine will always unread the last byte read 620 // (possibly a character belonging to the line end) even if that byte is not 621 // part of the line returned by ReadLine. 622 // 与ReadSlice 不同的是, ReadLine 是以换行符来分割 623 // ReadLine 是一个低级的原始的行读取操作 624 // 大多数情况下,应该使用 ReadBytes('\n') 或 ReadString('\n') 625 // 或者使用一个 Scanner 626 // 627 // ReadLine 通过调用 ReadSlice 方法实现,返回的也是缓存的切片 628 // ReadLine 尝试返回一个单行数据,不包括行尾标记(\n 或 \r\n) 629 // 如果在缓存中找不到行尾标记,则设置 isPrefix 为 true,表示查找未完成 630 // 同时读出缓存中的数据并作为切片返回 631 // 只有在当前缓存中找到行尾标记,才将 isPrefix 设置为 false,表示查找完成 632 // 可以多次调用 ReadLine 来读出一行 633 // 返回的数据在下一次读取操作之前是有效的 634 // 如果 ReadLine 无法获取任何数据,则返回一个错误信息(通常是 io.EOF) 635 /* 636 func main() { 637 s := strings.NewReader("ABC\nDEF\r\nGHI\r\nJKL") 638 br := bufio.NewReader(s) 639 640 w, isPrefix, _ := br.ReadLine() 641 fmt.Printf("%q %v\n", w, isPrefix) 642 // "ABC" false 643 644 w, isPrefix, _ = br.ReadLine() 645 fmt.Printf("%q %v\n", w, isPrefix) 646 // "DEF" false 647 648 w, isPrefix, _ = br.ReadLine() 649 fmt.Printf("%q %v\n", w, isPrefix) 650 // "GHI" false 651 } 652 */ 653 func (b *Reader) ReadLine() (line []byte, isPrefix bool, err error) { 654 line, err = b.ReadSlice('\n') 655 if err == ErrBufferFull { // 在找到\n之前 已经缓存的数据大于b本身的buffer size 656 // Handle the case where "\r\n" straddles the buffer. 657 if len(line) > 0 && line[len(line)-1] == '\r' { 658 // Put the '\r' back on buf and drop it from line. 659 // Let the next call to ReadLine check for "\r\n". 660 if b.r == 0 { 661 // should be unreachable 662 panic("bufio: tried to rewind past start of buffer") 663 } 664 b.r-- 665 line = line[:len(line)-1] // 去掉\r 666 } 667 return line, true, nil // 直接返回, isPrefix= true 表示没有找到行尾标记\n 就已经遇到了ErrBufferFull 668 } 669 670 if len(line) == 0 { // 如果没有找到数据 671 if err != nil { 672 line = nil 673 } 674 return 675 } 676 err = nil 677 678 if line[len(line)-1] == '\n' { 679 drop := 1 680 if len(line) > 1 && line[len(line)-2] == '\r' { 681 drop = 2 682 } 683 line = line[:len(line)-drop] // 去掉\r\n 684 } 685 return 686 } 687 688 // collectFragments reads until the first occurrence of delim in the input. It 689 // returns (slice of full buffers, remaining bytes before delim, total number 690 // of bytes in the combined first two elements, error). 691 // The complete result is equal to 692 // `bytes.Join(append(fullBuffers, finalFragment), nil)`, which has a 693 // length of `totalLen`. The result is structured in this way to allow callers 694 // to minimize allocations and copies. 695 // 收集碎片, 直到遇到第一个输入的delim 为止. 696 // 这种返回结构方式可以是的调用者以最小的代价分配和复制这些结果 697 func (b *Reader) collectFragments(delim byte) (fullBuffers [][]byte, finalFragment []byte, totalLen int, err error) { 698 var frag []byte 699 // Use ReadSlice to look for delim, accumulating full buffers. 700 for { // 一直到读到一个delim 或者引起 ErrBufferFull 为止 701 var e error 702 frag, e = b.ReadSlice(delim) // ReadSlice 能找到 delim,则 err 始终返回 nil 703 if e == nil { // got final fragment 704 break 705 } 706 if e != ErrBufferFull { // unexpected error // 如果没有找到delim 707 err = e 708 break 709 } 710 711 // Make a copy of the buffer. 712 buf := make([]byte, len(frag)) 713 copy(buf, frag) 714 fullBuffers = append(fullBuffers, buf) 715 totalLen += len(buf) 716 } 717 718 totalLen += len(frag) 719 return fullBuffers, frag, totalLen, err 720 } 721 722 // ReadBytes reads until the first occurrence of delim in the input, 723 // returning a slice containing the data up to and including the delimiter. 724 // If ReadBytes encounters an error before finding a delimiter, 725 // it returns the data read before the error and the error itself (often io.EOF). 726 // ReadBytes returns err != nil if and only if the returned data does not end in 727 // delim. 728 // For simple uses, a Scanner may be more convenient. 729 730 // ReadBytes 在 b 中查找 delim 并读出 delim 及其之前的所有数据 731 // 如果 ReadBytes 在找到 delim 之前遇到错误 732 // 则返回遇到错误之前的所有数据,同时返回遇到的错误(通常是 io.EOF) 733 // 只有当 ReadBytes 找不到 delim 时,err 才不为 nil 734 // 对于简单的用途,使用 Scanner 可能更方便 735 // 注意 ReadBytes 返回是带了delim的, 除非没有找到delim 736 /* 737 func main() { 738 s := strings.NewReader("ABC DEF GHI JKL") 739 br := bufio.NewReader(s) 740 741 w, _ := br.ReadBytes(' ') 742 fmt.Printf("%q\n", w) 743 // "ABC " 744 745 w, _ = br.ReadBytes(' ') 746 fmt.Printf("%q\n", w) 747 // "DEF " 748 749 w, _ = br.ReadBytes(' ') 750 fmt.Printf("%q\n", w) 751 // "GHI " 752 } 753 */ 754 func (b *Reader) ReadBytes(delim byte) ([]byte, error) { 755 full, frag, n, err := b.collectFragments(delim) 756 // Allocate new buffer to hold the full pieces and the fragment. 757 buf := make([]byte, n) // 申请n buf大小 758 n = 0 759 // Copy full pieces and fragment in. 760 for i := range full { 761 n += copy(buf[n:], full[i]) // 将full copy 到buf中 762 } 763 copy(buf[n:], frag) // 最后将frag copy 到buf中 764 return buf, err 765 } 766 767 // ReadString reads until the first occurrence of delim in the input, 768 // returning a string containing the data up to and including the delimiter. 769 // If ReadString encounters an error before finding a delimiter, 770 // it returns the data read before the error and the error itself (often io.EOF). 771 // ReadString returns err != nil if and only if the returned data does not end in 772 // delim. 773 // For simple uses, a Scanner may be more convenient. 774 // ReadString 功能同 ReadBytes,只不过返回的是一个字符串 775 /* 776 func main() { 777 s := strings.NewReader("ABC DEF GHI JKL") 778 br := bufio.NewReader(s) 779 780 w, _ := br.ReadString(' ') 781 fmt.Printf("%q\n", w) 782 // "ABC " 783 784 w, _ = br.ReadString(' ') 785 fmt.Printf("%q\n", w) 786 // "DEF " 787 788 w, _ = br.ReadString(' ') 789 fmt.Printf("%q\n", w) 790 // "GHI " 791 } 792 */ 793 func (b *Reader) ReadString(delim byte) (string, error) { 794 full, frag, n, err := b.collectFragments(delim) 795 // Allocate new buffer to hold the full pieces and the fragment. 796 var buf strings.Builder 797 buf.Grow(n) 798 // Copy full pieces and fragment in. 799 for _, fb := range full { 800 buf.Write(fb) 801 } 802 buf.Write(frag) 803 return buf.String(), err 804 } 805 806 // WriteTo implements io.WriterTo. 807 // This may make multiple calls to the Read method of the underlying Reader. 808 // If the underlying reader supports the WriteTo method, 809 // this calls the underlying WriteTo without buffering. 810 // 将缓存数据写入到w中 811 /* 812 func main() { 813 s := strings.NewReader("ABCEFG") 814 br := bufio.NewReader(s) 815 b := bytes.NewBuffer(make([]byte, 0)) 816 817 br.WriteTo(b) 818 fmt.Printf("%s\n", b) 819 // ABCEFG 820 } 821 */ 822 func (b *Reader) WriteTo(w io.Writer) (n int64, err error) { 823 n, err = b.writeBuf(w) // 将缓存数据写入到w中 824 if err != nil { 825 return 826 } 827 828 if r, ok := b.rd.(io.WriterTo); ok { 829 m, err := r.WriteTo(w) // 将io中的数据写入到w中 830 n += m 831 return n, err 832 } 833 834 if w, ok := w.(io.ReaderFrom); ok { 835 m, err := w.ReadFrom(b.rd) 836 n += m 837 return n, err 838 } 839 840 if b.w-b.r < len(b.buf) { // 缓存数据不够 841 b.fill() // buffer not full 842 } 843 844 for b.r < b.w { 845 // b.r < b.w => buffer is not empty 846 m, err := b.writeBuf(w) 847 n += m 848 if err != nil { 849 return n, err 850 } 851 b.fill() // buffer is empty 852 } 853 854 if b.err == io.EOF { 855 b.err = nil 856 } 857 858 return n, b.readErr() 859 } 860 861 var errNegativeWrite = errors.New("bufio: writer returned negative count from Write") 862 863 // writeBuf writes the Reader's buffer to the writer. 864 // 将reader buffer 写入到w 865 func (b *Reader) writeBuf(w io.Writer) (int64, error) { 866 n, err := w.Write(b.buf[b.r:b.w]) 867 if n < 0 { 868 panic(errNegativeWrite) 869 } 870 b.r += n 871 return int64(n), err 872 } 873 874 // buffered output 875 876 // Writer implements buffering for an io.Writer object. 877 // If an error occurs writing to a Writer, no more data will be 878 // accepted and all subsequent writes, and Flush, will return the error. 879 // After all data has been written, the client should call the 880 // Flush method to guarantee all data has been forwarded to 881 // the underlying io.Writer. 882 // Writer 实现了带缓存的 io.Writer 对象 883 // 如果在向 Writer 中写入数据的过程中遇到错误 884 // 则 Writer 不会再接受任何数据 885 // 而且后续的写入操作都将返回错误信息 886 type Writer struct { 887 err error // 写过程中遇到的错误 888 buf []byte // 缓存 889 n int // 当前缓存中的字节数 890 wr io.Writer // 底层的io.Writer 891 } 892 893 // NewWriterSize returns a new Writer whose buffer has at least the specified 894 // size. If the argument io.Writer is already a Writer with large enough 895 // size, it returns the underlying Writer. 896 // NewWriterSize 将 wr 封装成一个拥有 size 大小缓存的 bufio.Writer 对象 897 // 如果 wr 的基类型就是 bufio.Writer 类型,而且拥有足够的缓存 898 // 则直接将 wr 转换为基类型并返回 899 func NewWriterSize(w io.Writer, size int) *Writer { 900 // Is it already a Writer? 901 b, ok := w.(*Writer) 902 if ok && len(b.buf) >= size { 903 return b 904 } 905 if size <= 0 { 906 size = defaultBufSize 907 } 908 return &Writer{ 909 buf: make([]byte, size), 910 wr: w, 911 } 912 } 913 914 // NewWriter returns a new Writer whose buffer has the default size. 915 // NewWriter 相当于 NewWriterSize(wr, 4096) 916 func NewWriter(w io.Writer) *Writer { 917 return NewWriterSize(w, defaultBufSize) 918 } 919 920 // Size returns the size of the underlying buffer in bytes. 921 func (b *Writer) Size() int { return len(b.buf) } 922 923 // Reset discards any unflushed buffered data, clears any error, and 924 // resets b to write its output to w. 925 // 重置所有错误信息(如果有错误的话), 并且丢弃所有未刷盘的缓存数据 926 // Reset丢弃任何没有写入的缓存数据,清除任何错误并且重新将b指定它的输出结果指向w 927 /* 928 package main 929 930 import ( 931 "bufio" 932 "bytes" 933 "fmt" 934 ) 935 936 func main() { 937 b := bytes.NewBuffer(make([]byte, 0)) 938 bw := bufio.NewWriter(b) 939 bw.WriteString("123") 940 c := bytes.NewBuffer(make([]byte, 0)) 941 bw.Reset(c) 942 bw.WriteString("456") 943 bw.Flush() 944 fmt.Println(b) //输出为空 945 fmt.Println(c) //输出456 946 } 947 */ 948 func (b *Writer) Reset(w io.Writer) { 949 b.err = nil 950 b.n = 0 951 b.wr = w 952 } 953 954 // Flush writes any buffered data to the underlying io.Writer. 955 // Flush 将缓存中的数据提交到底层的 io.Writer 中 956 func (b *Writer) Flush() error { 957 if b.err != nil { 958 return b.err 959 } 960 if b.n == 0 { 961 return nil 962 } 963 n, err := b.wr.Write(b.buf[0:b.n]) // 将缓存数据全部写入 wr中 964 if n < b.n && err == nil { 965 err = io.ErrShortWrite // 没有写满 966 } 967 if err != nil { // 写错误 968 if n > 0 && n < b.n { 969 copy(b.buf[0:b.n-n], b.buf[n:b.n]) // copy 970 } 971 b.n -= n 972 b.err = err 973 return err 974 } 975 b.n = 0 // n =0 表示清空buffer 976 return nil 977 } 978 979 // Available returns how many bytes are unused in the buffer. 980 // Available 返回缓存中的可以空间 981 func (b *Writer) Available() int { return len(b.buf) - b.n } 982 983 // Buffered returns the number of bytes that have been written into the current buffer. 984 // Buffered 返回缓存中未提交的数据长度 985 func (b *Writer) Buffered() int { return b.n } 986 987 // Write writes the contents of p into the buffer. 988 // It returns the number of bytes written. 989 // If nn < len(p), it also returns an error explaining 990 // why the write is short. 991 // Write 将 p 中的数据写入 b 中,返回写入的字节数 992 // 如果写入的字节数小于 p 的长度,则返回一个错误信息 993 func (b *Writer) Write(p []byte) (nn int, err error) { 994 for len(p) > b.Available() && b.err == nil { // 如果写入数据长度大于能写的缓存大小 995 var n int 996 if b.Buffered() == 0 { // 当前没有要提交的写入数据 997 // Large write, empty buffer. 998 // Write directly from p to avoid copy. 999 n, b.err = b.wr.Write(p) // 则直接将p 写入到wr中 1000 } else { // 之前存在写入未提交的数据, 则copy 到buf中 1001 n = copy(b.buf[b.n:], p) 1002 b.n += n 1003 b.Flush() // 将buf刷入wr中 1004 } 1005 nn += n // 记录写入的字节大小 1006 p = p[n:] // 丢弃已写入的数据 1007 } 1008 if b.err != nil { 1009 return nn, b.err 1010 } 1011 n := copy(b.buf[b.n:], p) // 如果当前缓存可以直接写入, 则直接将p copy到缓存中 1012 b.n += n 1013 nn += n 1014 return nn, nil 1015 } 1016 1017 // WriteByte writes a single byte. 1018 // 写入单个字节 1019 func (b *Writer) WriteByte(c byte) error { 1020 if b.err != nil { 1021 return b.err 1022 } 1023 if b.Available() <= 0 && b.Flush() != nil { 1024 return b.err 1025 } 1026 b.buf[b.n] = c 1027 b.n++ 1028 return nil 1029 } 1030 1031 // WriteRune writes a single Unicode code point, returning 1032 // the number of bytes written and any error. 1033 // 写入单个rune 1034 /* 1035 func main() { 1036 b := bytes.NewBuffer(make([]byte, 0)) 1037 bw := bufio.NewWriter(b) 1038 bw.WriteByte('H') 1039 bw.WriteByte('e') 1040 bw.WriteByte('l') 1041 bw.WriteByte('l') 1042 bw.WriteByte('o') // 写入单个字节 1043 bw.WriteByte(' ') 1044 bw.WriteRune('世') // 写入单个字符 1045 bw.WriteRune('界') 1046 bw.WriteRune('!') 1047 bw.Flush() 1048 fmt.Println(b) // Hello 世界! 1049 1050 } 1051 1052 */ 1053 func (b *Writer) WriteRune(r rune) (size int, err error) { 1054 // Compare as uint32 to correctly handle negative runes. 1055 if uint32(r) < utf8.RuneSelf { 1056 err = b.WriteByte(byte(r)) 1057 if err != nil { 1058 return 0, err 1059 } 1060 return 1, nil 1061 } 1062 if b.err != nil { 1063 return 0, b.err 1064 } 1065 n := b.Available() 1066 if n < utf8.UTFMax { 1067 if b.Flush(); b.err != nil { 1068 return 0, b.err 1069 } 1070 n = b.Available() 1071 if n < utf8.UTFMax { 1072 // Can only happen if buffer is silly small. 1073 return b.WriteString(string(r)) 1074 } 1075 } 1076 size = utf8.EncodeRune(b.buf[b.n:], r) 1077 b.n += size 1078 return size, nil 1079 } 1080 1081 // WriteString writes a string. 1082 // It returns the number of bytes written. 1083 // If the count is less than len(s), it also returns an error explaining 1084 // why the write is short. 1085 // WriteString 同 Write,只不过写入的是字符串 1086 /* 1087 func main() { 1088 b := bytes.NewBuffer(make([]byte, 0)) 1089 bw := bufio.NewWriter(b) 1090 fmt.Println(bw.Available()) // 4096 1091 fmt.Println(bw.Buffered()) // 0 1092 1093 bw.WriteString("ABCDEFGH") 1094 fmt.Println(bw.Available()) // 4088 1095 fmt.Println(bw.Buffered()) // 8 1096 fmt.Printf("%q\n", b) // "" 1097 1098 bw.Flush() 1099 fmt.Println(bw.Available()) // 4096 1100 fmt.Println(bw.Buffered()) // 0 1101 fmt.Printf("%q\n", b) // "ABCEFG" 1102 } 1103 */ 1104 func (b *Writer) WriteString(s string) (int, error) { 1105 nn := 0 1106 for len(s) > b.Available() && b.err == nil { 1107 n := copy(b.buf[b.n:], s) 1108 b.n += n 1109 nn += n 1110 s = s[n:] 1111 b.Flush() 1112 } 1113 if b.err != nil { 1114 return nn, b.err 1115 } 1116 n := copy(b.buf[b.n:], s) 1117 b.n += n 1118 nn += n 1119 return nn, nil 1120 } 1121 1122 // ReadFrom implements io.ReaderFrom. If the underlying writer 1123 // supports the ReadFrom method, and b has no buffered data yet, 1124 // this calls the underlying ReadFrom without buffering. 1125 // ReadFrom 实现了 io.ReaderFrom 接口 1126 // 从reader中读取数据到指定的buffer中 1127 /* 1128 func main() { 1129 b := bytes.NewBuffer(make([]byte, 0)) 1130 s := strings.NewReader("Hello 世界!") 1131 bw := bufio.NewWriter(b) 1132 bw.ReadFrom(s) 1133 //bw.Flush() //ReadFrom无需使用Flush,其自己已经写入. 1134 fmt.Println(b) // Hello 世界! 1135 } 1136 */ 1137 func (b *Writer) ReadFrom(r io.Reader) (n int64, err error) { 1138 if b.err != nil { 1139 return 0, b.err 1140 } 1141 if b.Buffered() == 0 { // 缓存中没有数据 1142 if w, ok := b.wr.(io.ReaderFrom); ok { 1143 n, err = w.ReadFrom(r) 1144 b.err = err 1145 return n, err 1146 } 1147 } 1148 var m int 1149 for { 1150 if b.Available() == 0 { // 没有可写的缓存空间了 1151 if err1 := b.Flush(); err1 != nil { 1152 return n, err1 1153 } 1154 } 1155 nr := 0 1156 for nr < maxConsecutiveEmptyReads { // 最大连续空读次数 100 1157 m, err = r.Read(b.buf[b.n:]) 1158 if m != 0 || err != nil { 1159 break 1160 } 1161 nr++ 1162 } 1163 if nr == maxConsecutiveEmptyReads { 1164 return n, io.ErrNoProgress 1165 } 1166 b.n += m 1167 n += int64(m) 1168 if err != nil { 1169 break 1170 } 1171 } 1172 if err == io.EOF { 1173 // If we filled the buffer exactly, flush preemptively. 1174 if b.Available() == 0 { 1175 err = b.Flush() 1176 } else { 1177 err = nil 1178 } 1179 } 1180 return n, err 1181 } 1182 1183 // buffered input and output 1184 1185 // ReadWriter stores pointers to a Reader and a Writer. 1186 // It implements io.ReadWriter. 1187 // ReadWriter 集成了 bufio.Reader 和 bufio.Writer 1188 // 它实现了 io.ReadWriter 接口 1189 type ReadWriter struct { 1190 *Reader 1191 *Writer 1192 } 1193 1194 // NewReadWriter allocates a new ReadWriter that dispatches to r and w. 1195 /* 1196 package main 1197 1198 import ( 1199 "bufio" 1200 "bytes" 1201 "fmt" 1202 "strings" 1203 ) 1204 1205 func main() { 1206 b := bytes.NewBuffer(make([]byte, 0)) 1207 bw := bufio.NewWriter(b) 1208 s := strings.NewReader("123") 1209 br := bufio.NewReader(s) 1210 rw := bufio.NewReadWriter(br, bw) 1211 p, _ := rw.ReadString('\n') 1212 fmt.Println(string(p)) //123 1213 rw.WriteString("asdf") 1214 rw.Flush() 1215 fmt.Println(b) //asdf 1216 } 1217 */ 1218 func NewReadWriter(r *Reader, w *Writer) *ReadWriter { 1219 return &ReadWriter{r, w} 1220 }