reader.go 1.2 KB

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