使用缓冲的io writer时,如果发生错误,我该如何进行重试? 例如,我使用Write()编写了4096B,并且当bufwriter自动刷新数据时发生错误。然后我想重试写4096B,我怎么能这样做? 看来我必须自己保留4096B缓冲区来执行重试。其他我无法获得数据未被刷新。 有什么建议吗?
答案 0 :(得分:1)
您必须使用自定义io.Writer
来保留所有数据的副本,以便在重试时可以重复使用。
此功能不属于标准库,但不应自行实现。
答案 1 :(得分:1)
当bufio.Writer
在Write(..)
上失败时,它会将写入的字节数(n
)返回缓冲区(err
)。
您可以做的是以下内容。 (注意我还没试过这个,所以可能有点不对劲,可以使用一些清理工作)
func writeSomething(data []byte, w *bufio.Writer) (err error) {
var pos, written int = 0
for pos != len(data) {
written, err = w.Write(data[pos:])
if err != nil {
if err == io.ErrShortWrite {
pos += written // Write was shot. Update pos and keep going
continue
} else netErr, ok := err.(net.Error); ok && netErr.Temporary() {
continue // Temporary error, don't update pos so it will try writing again
} else {
break // Unrecoverable error, bail
}
} else {
pos += written
}
}
return nil
}