如何将 Stream<Byte> 转换为 InputStream
How can I convert Stream<Byte> to InputStream
我在 Java/Kotlin(jvm) 中有 java.util.stream.Stream<Byte>
。
如何将 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())
}
你可以用这样的东西来实现它:
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
}
您可能需要覆盖更多方法来提高性能或提供更多功能,例如关闭流。
另外,请注意我没有彻底测试这段代码。
我在 Java/Kotlin(jvm) 中有 java.util.stream.Stream<Byte>
。
如何将 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())
}
你可以用这样的东西来实现它:
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
}
您可能需要覆盖更多方法来提高性能或提供更多功能,例如关闭流。
另外,请注意我没有彻底测试这段代码。