buffered_reader.go 1.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  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 (v *BufferedReader) IsBuffered() bool {
  21. return v.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 (v *BufferedReader) SetBuffered(cached bool) {
  26. v.buffered = cached
  27. }
  28. // Read implements io.Reader.Read().
  29. func (v *BufferedReader) Read(b []byte) (int, error) {
  30. if !v.buffered || v.buffer == nil {
  31. if !v.buffer.IsEmpty() {
  32. return v.buffer.Read(b)
  33. }
  34. return v.reader.Read(b)
  35. }
  36. if v.buffer.IsEmpty() {
  37. err := v.buffer.AppendSupplier(ReadFrom(v.reader))
  38. if err != nil {
  39. return 0, err
  40. }
  41. }
  42. if v.buffer.IsEmpty() {
  43. return 0, nil
  44. }
  45. return v.buffer.Read(b)
  46. }