buffered_reader.go 1.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. package buf
  2. import (
  3. "io"
  4. )
  5. // BufferedReader is a reader with internal cache.
  6. type BufferedReader struct {
  7. reader io.Reader
  8. buffer *Buffer
  9. buffered bool
  10. }
  11. // NewBufferedReader creates a new BufferedReader based on an io.Reader.
  12. func NewBufferedReader(rawReader io.Reader) *BufferedReader {
  13. return &BufferedReader{
  14. reader: rawReader,
  15. buffer: NewLocal(1024),
  16. buffered: true,
  17. }
  18. }
  19. // IsBuffered returns true if the internal cache is effective.
  20. func (r *BufferedReader) IsBuffered() bool {
  21. return r.buffered
  22. }
  23. // SetBuffered is to enable or disable internal cache. If cache is disabled,
  24. // Read() calls will be delegated to the underlying io.Reader directly.
  25. func (r *BufferedReader) SetBuffered(cached bool) {
  26. r.buffered = cached
  27. }
  28. // Read implements io.Reader.Read().
  29. func (r *BufferedReader) Read(b []byte) (int, error) {
  30. if !r.buffered || r.buffer == nil {
  31. if !r.buffer.IsEmpty() {
  32. return r.buffer.Read(b)
  33. }
  34. return r.reader.Read(b)
  35. }
  36. if r.buffer.IsEmpty() {
  37. if err := r.buffer.Reset(ReadFrom(r.reader)); err != nil {
  38. return 0, err
  39. }
  40. }
  41. if r.buffer.IsEmpty() {
  42. return 0, nil
  43. }
  44. return r.buffer.Read(b)
  45. }