60 lines
1.1 KiB
Go
60 lines
1.1 KiB
Go
package main
|
|
|
|
import (
|
|
"errors"
|
|
"fmt"
|
|
"io"
|
|
"os"
|
|
)
|
|
|
|
// PrefixReader 自定义Reader,读取固定前缀数据
|
|
type PrefixReader struct {
|
|
data []byte
|
|
offset int // 读取偏移量
|
|
}
|
|
|
|
// NewPrefixReader 创建自定义Reader实例
|
|
func NewPrefixReader(s string) *PrefixReader {
|
|
return &PrefixReader{
|
|
data: []byte(s),
|
|
}
|
|
}
|
|
|
|
// Read 实现io.Reader接口
|
|
func (r *PrefixReader) Read(p []byte) (int, error) {
|
|
if r.offset >= len(r.data) {
|
|
return 0, io.EOF
|
|
}
|
|
n := copy(p, r.data[r.offset:])
|
|
r.offset += n
|
|
return n, nil
|
|
}
|
|
|
|
func main() {
|
|
// 初始化自定义Reader
|
|
reader := NewPrefixReader("Go IO Reader 最佳实践")
|
|
buf := make([]byte, 16)
|
|
|
|
// 打开文件写入自定义Reader读取的数据
|
|
file, err := os.Create("io/reader.txt")
|
|
if err != nil {
|
|
fmt.Printf("创建文件失败: %v\n", err)
|
|
return
|
|
}
|
|
defer file.Close()
|
|
|
|
// 流式读取并写入文件
|
|
for {
|
|
n, err := reader.Read(buf)
|
|
if err == io.EOF {
|
|
break
|
|
}
|
|
if err != nil {
|
|
errors.New("读取失败")
|
|
return
|
|
}
|
|
_, _ = file.Write(buf[:n])
|
|
}
|
|
fmt.Println("自定义Reader读写完成")
|
|
}
|