reader.go 1.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. package io // import "github.com/v2ray/v2ray-core/common/io"
  2. import (
  3. "io"
  4. "github.com/v2ray/v2ray-core/common"
  5. "github.com/v2ray/v2ray-core/common/alloc"
  6. )
  7. // Reader extends io.Reader with alloc.Buffer.
  8. type Reader interface {
  9. common.Releasable
  10. // Read reads content from underlying reader, and put it into an alloc.Buffer.
  11. Read() (*alloc.Buffer, error)
  12. }
  13. // AdaptiveReader is a Reader that adjusts its reading speed automatically.
  14. type AdaptiveReader struct {
  15. reader io.Reader
  16. allocate func() *alloc.Buffer
  17. }
  18. // NewAdaptiveReader creates a new AdaptiveReader.
  19. // The AdaptiveReader instance doesn't take the ownership of reader.
  20. func NewAdaptiveReader(reader io.Reader) *AdaptiveReader {
  21. return &AdaptiveReader{
  22. reader: reader,
  23. allocate: alloc.NewBuffer,
  24. }
  25. }
  26. // Read implements Reader.Read().
  27. func (this *AdaptiveReader) Read() (*alloc.Buffer, error) {
  28. buffer := this.allocate().Clear()
  29. _, err := buffer.FillFrom(this.reader)
  30. if err != nil {
  31. buffer.Release()
  32. return nil, err
  33. }
  34. if buffer.Len() >= alloc.BufferSize {
  35. this.allocate = alloc.NewLargeBuffer
  36. } else {
  37. this.allocate = alloc.NewBuffer
  38. }
  39. return buffer, nil
  40. }
  41. func (this *AdaptiveReader) Release() {
  42. this.reader = nil
  43. }