如何在golang中获取bufio.Writer中缓冲的数据

时间:2017-08-22 10:15:18

标签: go

使用缓冲的io writer时,如果发生错误,我该如何进行重试? 例如,我使用Write()编写了4096B,并且当bufwriter自动刷新数据时发生错误。然后我想重试写4096B,我怎么能这样做? 看来我必须自己保留4096B缓冲区来执行重试。其他我无法获得数据未被刷新。 有什么建议吗?

2 个答案:

答案 0 :(得分:1)

您必须使用自定义io.Writer来保留所有数据的副本,以便在重试时可以重复使用。

此功能不属于标准库,但不应自行实现。

答案 1 :(得分:1)

bufio.WriterWrite(..)上失败时,它会将写入的字节数(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
}