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  // -----------------------------------------------------------------------------