tipsy
01/31/2020, 3:30 PMinputStream.apply { skip(from.toLong()) }.use {
var bytesLeft = bytesToWrite
while (bytesLeft != 0) {
val read = it.read(buffer, 0, Math.min(buffer.size, bytesLeft))
outputStream.write(buffer, 0, read)
bytesLeft -= read
}
}
Matteo Mirk
01/31/2020, 3:54 PMtransferTo(OutputStream)
https://docs.oracle.com/javase/9/docs/api/java/io/InputStream.html#transferTo-java.io.OutputStream-
So you can write:
inputStream.apply {
skip(from.toLong())
}.transferTo(outputStream)
This works well if both are simple In/Out streams, otherwise if you’re dealing with files (FileInputStream/FileOutputStream) you should prefer Files.copy
as it will be faster.trevjones
01/31/2020, 3:55 PM.apply
and move the skip into the use blocktipsy
01/31/2020, 4:10 PMMatteo Mirk
01/31/2020, 4:13 PMMatteo Mirk
01/31/2020, 4:14 PMtipsy
01/31/2020, 4:14 PMtipsy
01/31/2020, 4:15 PMMatteo Mirk
01/31/2020, 4:15 PMMatteo Mirk
01/31/2020, 4:15 PMtipsy
01/31/2020, 4:15 PMtrevjones
01/31/2020, 4:16 PMtrevjones
01/31/2020, 4:16 PMtrevjones
01/31/2020, 4:17 PMinputStream.use {
it.skip(from.toLong())
it.copyTo(outputStream)
}
tipsy
01/31/2020, 4:17 PMtipsy
01/31/2020, 4:18 PMtrevjones
01/31/2020, 4:19 PMMatteo Mirk
01/31/2020, 4:22 PMkotlin has a copyTo ext function already as wellOhh cool didn’t know it! Of course it has one 😉
trevjones
01/31/2020, 4:24 PMSequence<Byte>
so you could do something like .takeWhile
(if that is a thing, or maybe I just am stuck in reactivex thinking too far?)trevjones
01/31/2020, 4:25 PMtipsy
01/31/2020, 4:35 PMprivate fun InputStream.copyTo(outputStream: OutputStream, from: Int, to: Int, buffer: ByteArray = ByteArray(1024)) = this.use {
it.skip(from.toLong())
var bytesLeft = to
while (bytesLeft != 0) {
val read = it.read(buffer, 0, Math.min(buffer.size, bytesLeft))
outputStream.write(buffer, 0, read)
bytesLeft -= read
}
}
tipsy
01/31/2020, 4:36 PMtipsy
01/31/2020, 4:36 PMtrevjones
01/31/2020, 4:37 PMMath.min
looks from java but kotlin has a top level min
I thought?tipsy
01/31/2020, 4:38 PMbuffer.size.coerceAtMost(bytesLeft))
tipsy
01/31/2020, 4:39 PMtrevjones
01/31/2020, 4:41 PM