buffered_reader.go 944 B

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. package io
  2. import (
  3. "io"
  4. "github.com/v2ray/v2ray-core/common/alloc"
  5. )
  6. type BufferedReader struct {
  7. reader io.Reader
  8. buffer *alloc.Buffer
  9. cached bool
  10. }
  11. func NewBufferedReader(rawReader io.Reader) *BufferedReader {
  12. return &BufferedReader{
  13. reader: rawReader,
  14. buffer: alloc.NewBuffer().Clear(),
  15. cached: true,
  16. }
  17. }
  18. func (this *BufferedReader) Release() {
  19. this.buffer.Release()
  20. this.buffer = nil
  21. this.reader = nil
  22. }
  23. func (this *BufferedReader) Cached() bool {
  24. return this.cached
  25. }
  26. func (this *BufferedReader) SetCached(cached bool) {
  27. this.cached = cached
  28. }
  29. func (this *BufferedReader) Read(b []byte) (int, error) {
  30. if !this.cached {
  31. if !this.buffer.IsEmpty() {
  32. return this.buffer.Read(b)
  33. }
  34. return this.reader.Read(b)
  35. }
  36. if this.buffer.IsEmpty() {
  37. _, err := this.buffer.FillFrom(this.reader)
  38. if err != nil {
  39. return 0, err
  40. }
  41. }
  42. if this.buffer.IsEmpty() {
  43. return 0, nil
  44. }
  45. return this.buffer.Read(b)
  46. }