从InputStream获取一个Publisher<ByteBuffer>

5
我刚刚升级了我的mongo-db-java-driver,现在方便的函数GridFSBucket.uploadFromStream已经消失了。因此我们现在得到了
GridFSUploadPublisher<ObjectId> uploadFromPublisher(String filename, Publisher<ByteBuffer> source);

有没有思路将我的InputStream转换成 Publisher<ByteBuffer>?在Java驱动程序或者Reactor中是否有任何工具函数可用?

你使用的是哪个库以及它的哪个版本? - Progman
@Progman mongodb-driver-reactivestreams 4.0.5 - wutzebaer
使用mongodb-driver-sync 4.0.5是一个选择吗? - Progman
@Progman 不,我们在几个月前已经将所有东西从mongodb-driver-sync切换过来,希望保持未来的兼容性。 - wutzebaer
2个回答

2

在Spring框架中有一个工具可以将输入流转换为数据缓冲区流。而且它直接将数据缓冲区映射为字节缓冲区。

Flux<ByteBuffer> byteBufferFlux = DataBufferUtils.readByteChannel(() -> Channels.newChannel(inputStream), DefaultDataBufferFactory.sharedInstance, 4096).map(DataBuffer::asByteBuffer);

1

为了使其工作,可以读取流并将数据存储在byte[]数组中,然后可以使用ByteBuffer.wrap(byte[])方法对其进行包装。

我查看了旧版MongoDB驱动程序的源代码,并发现流被用作实际流,因此在那时它没有被偷偷地转换为ByteBuffer。

似乎没有方法以数据到达的方式流式传输数据,现在除了将文件加载到内存中之外别无选择。 我可以看到这可能在许多情况下都是个问题,但也许我只是无法理解这种方法的某些方面。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接