*旧笔记 使用bytes.Buffer作为io.CopyBuffer的写入对象,CopyBuffer会调用Buffer.ReadFrom 即使被写入的数据量与Buffer.Cap一致,Buffer也会扩大 确保指定大小的数据被缓存
(size int64)
| 196 | |
| 197 | // 确保指定大小的数据被缓存 |
| 198 | func (f *FileStream) ensureCache(size int64) (model.File, error) { |
| 199 | if f.peek == nil { |
| 200 | blockSize := min(size, f.GetSize(), int64(conf.MaxBlockLimit)) |
| 201 | var err error |
| 202 | f.hc, err = hcache.NewHybridCache(uint64(blockSize), uint64(f.GetSize())) |
| 203 | if err != nil { |
| 204 | return nil, err |
| 205 | } |
| 206 | f.peek = buffer.NewDynamicReadAtSeeker(f.hc) |
| 207 | f.oriReader = f.Reader |
| 208 | f.Reader = io.MultiReader(f.peek, f.oriReader) |
| 209 | f.Add(f.hc) |
| 210 | } |
| 211 | size = size - f.peek.Size() |
| 212 | if size <= 0 { |
| 213 | return f.peek, nil |
| 214 | } |
| 215 | written, err := f.hc.CopyFromN(f.oriReader, size) |
| 216 | if written != size { |
| 217 | f.hc.RewindBySize(uint64(size - written)) |
| 218 | return nil, fmt.Errorf("failed to read all data: (expect =%d, actual =%d) %w", size, written, err) |
| 219 | } |
| 220 | if f.peek.Size() >= f.GetSize() { |
| 221 | f.Reader = f.peek |
| 222 | } |
| 223 | return f.peek, nil |
| 224 | } |
| 225 | |
| 226 | var _ model.FileStreamer = (*SeekableStream)(nil) |
| 227 | var _ model.FileStreamer = (*FileStream)(nil) |
no test coverage detected