我有java.util.stream.Stream<Byte>Java/Kotlin(jvm)。
如何java.util.stream.Stream<Byte>在java.io.InputStream不將每個緩沖區保留在記憶體中的情況下轉換為。
我可以通過
fun convertToInputStream(byteStream: Stream<Byte>) = ByteArrayInputStream(byteStream.collect(Collectors.toList()).toByteArray())
在我的示例中,如果我使用大限制,我將收到 OutOfMemoryError,因為它在記憶體中創建了一個大位元組 []
import java.io.ByteArrayInputStream
import java.io.File
import java.util.stream.Collectors
import java.util.stream.IntStream
import java.util.stream.Stream
fun convertToInputStream(byteStream: Stream<Byte>) = ByteArrayInputStream(byteStream.collect(Collectors.toList()).toByteArray())
fun main() {
val file = File("/tmp/data.txt")
val inputStream = convertToInputStream(
IntStream.iterate(1) { 65 it % 3 }.limit(1000000000).mapToObj { it.toByte() }
)
inputStream.copyTo(file.outputStream())
}
uj5u.com熱心網友回復:
你可以用這樣的東西來實作它:
fun main() {
val stream = Stream.of<Byte>(10, 15, -50, 20, 50)
val buf = ByteArrayOutputStream()
stream.asInputStream().transferTo(buf)
val bytes = buf.toByteArray() // [10, 15, -50, 20, 50]
}
fun Stream<Byte>.asInputStream() = object : InputStream() {
private val iter = iterator()
override fun read() = if (iter.hasNext()) iter.next().toUByte().toInt() else -1
}
您可能需要覆寫更多方法以提高性能或提供更多功能,例如關閉流。
另外,請注意,我沒有徹底測驗此代碼。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/324541.html
上一篇:無法在一個專案中決議com.mapbox.mapboxsdk:mapbox-android-accounts:0.7.0,但在另一個專案中可以嗎?
