github.com/qiniu/x@v1.11.9/bufiox/seek.go (about) 1 package bufiox 2 3 import ( 4 "bufio" 5 "io" 6 ) 7 8 // ----------------------------------------------------------------------------- 9 10 // Reader class. 11 type Reader struct { 12 bufio.Reader 13 } 14 15 const ( 16 defaultBufSize = 4096 17 ) 18 19 // NewReader returns a new Reader whose buffer has the default size. 20 func NewReader(rd io.ReadSeeker) *Reader { 21 return NewReaderSize(rd, defaultBufSize) 22 } 23 24 // NewReaderSize returns a new Reader whose buffer has at least the specified 25 // size. If the argument io.Reader is already a Reader with large enough size, 26 // it returns the underlying Reader. 27 // 28 func NewReaderSize(rd io.ReadSeeker, size int) *Reader { 29 b, ok := rd.(*Reader) 30 if ok && b.Size() >= size { 31 return b 32 } 33 r := bufio.NewReaderSize(rd, size) 34 return &Reader{Reader: *r} 35 } 36 37 // Seek sets the offset for the next Read or Write to offset, interpreted 38 // according to whence: SeekStart means relative to the start of the file, 39 // SeekCurrent means relative to the current offset, and SeekEnd means 40 // relative to the end. Seek returns the new offset relative to the start 41 // of the file and an error, if any. 42 // 43 func (r *Reader) Seek(offset int64, whence int) (int64, error) { 44 return Seek(&r.Reader, offset, whence) 45 } 46 47 // ReadAtLeast reads from r into buf until it has read at least min bytes. 48 // It returns the number of bytes copied and an error if fewer bytes were read. 49 // The error is EOF only if no bytes were read. 50 // If an EOF happens after reading fewer than min bytes, 51 // ReadAtLeast returns ErrUnexpectedEOF. 52 // If min is greater than the length of buf, ReadAtLeast returns ErrShortBuffer. 53 // On return, n >= min if and only if err == nil. 54 // If r returns an error having read at least min bytes, the error is dropped. 55 func (r *Reader) ReadAtLeast(buf []byte, min int) (n int, err error) { 56 return ReadAtLeast(&r.Reader, buf, min) 57 } 58 59 // ReadFull reads exactly len(buf) bytes from r into buf. 60 // It returns the number of bytes copied and an error if fewer bytes were read. 61 // The error is EOF only if no bytes were read. 62 // If an EOF happens after reading some but not all the bytes, 63 // ReadFull returns ErrUnexpectedEOF. 64 // On return, n == len(buf) if and only if err == nil. 65 // If r returns an error having read at least len(buf) bytes, the error is dropped. 66 func (r *Reader) ReadFull(buf []byte) (n int, err error) { 67 return ReadAtLeast(&r.Reader, buf, len(buf)) 68 } 69 70 // ----------------------------------------------------------------------------- 71 72 // UnderlyingReader returns the underlying reader. 73 func UnderlyingReader(b interface{}) io.Reader { 74 switch v := b.(type) { 75 case *Reader: 76 return getUnderlyingReader(&v.Reader) 77 case *bufio.Reader: 78 return getUnderlyingReader(v) 79 default: 80 panic("can only get the underlying reader of *bufiox.Reader or *bufio.Reader") 81 } 82 } 83 84 // -----------------------------------------------------------------------------