buffer_seeker.go 590 B

12345678910111213141516171819202122232425262728293031323334
  1. package bufioutil
  2. import (
  3. "bufio"
  4. "io"
  5. )
  6. type BufferedSeeker struct {
  7. rs io.ReadSeeker
  8. br *bufio.Reader
  9. }
  10. func NewBufferedSeeker(rs io.ReadSeeker, size int) *BufferedSeeker {
  11. return &BufferedSeeker{
  12. rs: rs,
  13. br: bufio.NewReaderSize(rs, size),
  14. }
  15. }
  16. func (b *BufferedSeeker) Read(p []byte) (int, error) {
  17. return b.br.Read(p)
  18. }
  19. func (b *BufferedSeeker) Seek(offset int64, whence int) (int64, error) {
  20. if whence == io.SeekCurrent {
  21. offset -= int64(b.br.Buffered())
  22. }
  23. n, err := b.rs.Seek(offset, whence)
  24. if err != nil {
  25. return 0, err
  26. }
  27. b.br.Reset(b.rs)
  28. return n, nil
  29. }