OnlineLibrary

Форк
0
64 строки · 1.2 Кб
1
package buffer
2

3
import (
4
	"bytes"
5
	"fmt"
6
	"io"
7
)
8

9
const default_buffer_size = 1024 * 16
10

11
type Reader struct {
12
	source           io.ReadSeeker
13
	nReadsFromSource int64
14
	buffer           []byte
15
	br               *bytes.Reader
16
	lastErr          error
17
}
18

19
func NewReader(src io.ReadSeeker) *Reader {
20
	return NewReaderSize(src, default_buffer_size)
21
}
22

23
func NewReaderSize(src io.ReadSeeker, bufSize int) *Reader {
24
	r := new(Reader)
25
	r.source = src
26
	r.buffer = make([]byte, bufSize)
27
	r.br = bytes.NewReader(nil)
28
	return r
29
}
30

31
func (r *Reader) Read(p []byte) (int, error) {
32
	if len(p) == 0 {
33
		return 0, io.ErrShortBuffer
34
	}
35
	if r.br.Len() == 0 {
36
		if r.lastErr != nil {
37
			return 0, r.lastErr
38
		}
39
		var n int
40
		n, r.lastErr = r.source.Read(r.buffer)
41
		if n == 0 {
42
			return 0, r.lastErr
43
		}
44
		r.nReadsFromSource += int64(n)
45
		r.br.Reset(r.buffer[:n])
46
	}
47
	return r.br.Read(p)
48
}
49

50
func (r *Reader) Seek(offset int64, whence int) (int64, error) {
51
	if offset < 0 {
52
		return 0, fmt.Errorf("negative offset not supported")
53
	}
54
	if whence != io.SeekStart {
55
		return 0, fmt.Errorf("whence %v not supported", whence)
56
	}
57
	r.br.Reset(nil)
58
	sourceOffset, err := r.source.Seek(offset, io.SeekStart)
59
	if err != nil {
60
		r.lastErr = err
61
	}
62
	r.nReadsFromSource = sourceOffset
63
	return sourceOffset, err
64
}
65

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.