【发布时间】:2018-03-25 14:51:35
【问题描述】:
在 Golang 中是否有 io.ReadWriteSeeker 的实现?
由于bytes.Buffer 没有实现Seek 方法,我需要找到这样的实现来用作zipwriter 写入的缓冲区并通过查找来读取。
此外,我不会使用Reader(buff.Bytes()) 来隐藏内存副本,因为我无法为缓冲数据提供双倍内存大小。
另外,当使用os.File作为选项时,如果我不调用f.Sync,它永远不会触及文件系统,对吧?谢谢。
我的简化代码:
func process() {
buff := new(bytes.Buffer)
zipWriter := zip.NewWriter(buff)
// here to add data into zipWriter in sequence
zipWriter.Close()
upload(buff) // upload(io.ReadSeeker)
}
【问题讨论】:
-
bytes.Buffer.Bytes 不复制字节。 bytes.Reader 实现了 io.Reader 和 io.Seeker。您确定需要一种类型的所有接口吗?我只能从头顶想到 os.File。
-
似乎在使用 Reader(buff.Bytes()) 时占用了太多内存,可能是由于字节片要堆叠造成的。是的,我想我必须使用这种类型,因为我买不起在 Writer 和 ReadSeeker 之间转换的内存。
-
ReadSeeker 必然需要所有数据的副本。否则不可能找到开头和/或结尾。
-
嗨彼得,我的情况是数据缓冲后不再写入,所以在读取之前是完整的副本。
-
现在我更不明白为什么您需要单一类型的所有内容。最好包含遇到问题的代码。而且,再次, bytes.NewReader(buff.Bytes()) 不会复制任何字节。