Skip to content

Instantly share code, notes, and snippets.

@ZacSweers
Created September 16, 2018 06:02
Show Gist options
  • Select an option

  • Save ZacSweers/0dfa1b38f23558cfd1a0a391cfab3542 to your computer and use it in GitHub Desktop.

Select an option

Save ZacSweers/0dfa1b38f23558cfd1a0a391cfab3542 to your computer and use it in GitHub Desktop.

Revisions

  1. ZacSweers created this gist Sep 16, 2018.
    49 changes: 49 additions & 0 deletions OkioAtomicFile.kt
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,49 @@
    import android.util.AtomicFile
    import okio.Buffer
    import okio.Sink
    import okio.sink
    import okio.source
    import java.io.FileOutputStream
    import java.io.IOException

    fun AtomicFile.source() = openRead().source()

    fun AtomicFile.sink(): Sink {
    return object : Sink {
    val fos: FileOutputStream = startWrite()
    val sink: Sink = fos.sink()
    var terminated = false

    override fun write(source: Buffer, byteCount: Long) {
    guardedIo {
    sink.write(source, byteCount)
    }
    }

    override fun flush() {
    guardedIo {
    sink.flush()
    }
    }

    override fun timeout() = sink.timeout()

    override fun close() {
    guardedIo {
    finishWrite(fos)
    }
    terminated = true
    }

    private fun <T> guardedIo(block: () -> T): T {
    if (terminated) throw IOException("terminated")
    try {
    return block()
    } catch (e: IOException) {
    terminated = true
    failWrite(fos)
    throw e
    }
    }
    }
    }