简体   繁体   English

我如何转换流<Byte>到输入流

[英]How can I convert Stream<Byte> to InputStream

I have java.util.stream.Stream<Byte> in Java/Kotlin(jvm).我在 Java/Kotlin(jvm) 中有java.util.stream.Stream<Byte>

How can I convert java.util.stream.Stream<Byte> to java.io.InputStream without keeping each buffer in memory.如何将java.util.stream.Stream<Byte>转换为java.io.InputStream而不将每个缓冲区保留在内存中。

I can do this conversion by我可以通过

val inputStream = ByteArrayInputStream(byteStream.collect(Collectors.toList()).toByteArray())

But it will create a large byte[]/ByteArray in memory if the stream is very long.但是如果流很长,它会在内存中创建一个大的 byte[]/ByteArray 。

You could implement it with something like this:你可以用这样的东西来实现它:

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
}

You would probably need to override more methods to improve performance or provide more functionality, like for example closing the stream.您可能需要覆盖更多方法以提高性能或提供更多功能,例如关闭流。

Also, note that I didn't test this code thoroughly.另外,请注意,我没有彻底测试此代码。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM