2017-08-22 13 views
1

バッファリングされたioライタが使用され、何らかのエラーが発生した場合、どのように再試行できますか? たとえば、Write()を使用して4096Bを書きましたが、bufwriterが自動的にデータをフラッシュするとエラーが発生します。それから私は4096Bを書き直したいのですが、どうすればいいのですか? 再試行を行うには4096Bのバッファを自分で保つ必要があるようです。その他のデータをフラッシュすることができませんでした。 提案がありますか?バッファに格納されたデータを取得する方法

答えて

1

再試行の場合に再利用できるように、すべてのデータのコピーを保持するカスタムio.Writerを使用する必要があります。

この機能は標準ライブラリの一部ではありませんが、実装するのは難しいはずはありません。

1

bufio.WriterWrite(..)で失敗すると、理由(err)が書き込まれたバイト数(n)がバッファに返されます。

あなたができることは次のとおりです。 (それは少し間違っている可能性があり、いくつかのクリーンアップを使用できるよう、私はこれをまだ試していない

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 
} 
+0

は、ときに私それは、)(すべての書き込みに成功した)が、内部フラッシュ(に失敗する可能性があります再試行するためのデータを取得できません。 Write()またはFlush()で失敗した場合は、Reset()を使用して再度使用できるようにする必要があります。 –

関連する問題