buffered_reader.go 906 B

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  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. }
  21. func (this *BufferedReader) Cached() bool {
  22. return this.cached
  23. }
  24. func (this *BufferedReader) SetCached(cached bool) {
  25. this.cached = cached
  26. }
  27. func (this *BufferedReader) Read(b []byte) (int, error) {
  28. if !this.cached {
  29. if !this.buffer.IsEmpty() {
  30. return this.buffer.Read(b)
  31. }
  32. return this.reader.Read(b)
  33. }
  34. if this.buffer.IsEmpty() {
  35. _, err := this.buffer.FillFrom(this.reader)
  36. if err != nil {
  37. return 0, err
  38. }
  39. }
  40. if this.buffer.IsEmpty() {
  41. return 0, nil
  42. }
  43. return this.buffer.Read(b)
  44. }