问题描述
我刚刚升级了mongo-db-java-driver,现在方便的功能GridFSBucket.uploadFromStream
已经消失了。因此,我们现在得到了一个
GridFSUploadPublisher<ObjectId> uploadFromPublisher(String filename,Publisher<ByteBuffer> source);
有什么想法如何将InputStream转换为Publisher<ByteBuffer>
? Java驱动程序或Reactor中是否有任何实用程序?
解决方法
spring 框架中有一个实用程序可以将输入流转换为数据缓冲区通量。并且直接将数据缓冲区映射为字节缓冲区。
Flux<ByteBuffer> byteBufferFlux = DataBufferUtils.readByteChannel(() -> Channels.newChannel(inputStream),DefaultDataBufferFactory.sharedInstance,4096).map(DataBuffer::asByteBuffer);
,
要使其工作,可以读取流并将数据存储在byte[]
数组中,以后可以用ByteBuffer.wrap(byte[])
方法包装。
我研究了较旧的MongoDB驱动程序的源代码,发现流被用作实际流,因此在那时它并没有被偷偷转换为ByteBuffer。
似乎没有其他方法可以流式传输数据,没有其他方法可以将文件加载到内存中。我可以看到在很多情况下这是一个问题,但是也许我只是不了解这种方法。