【问题标题】:Get an Publisher<ByteBuffer> from InputStream从 InputStream 获取 Publisher<ByteBuffer>
【发布时间】:2020-09-17 20:20:39
【问题描述】:

我刚刚升级了我的 mongo-db-java-driver,现在方便的功能 GridFSBucket.uploadFromStream 已经消失了。因此我们现在得到了一个

GridFSUploadPublisher<ObjectId> uploadFromPublisher(String filename, Publisher<ByteBuffer> source);

任何想法如何将我的 InputStream 转换为Publisher&lt;ByteBuffer&gt;? java驱动或者Reactor里面有没有utilfunction?

【问题讨论】:

  • 您到底在使用哪个库以及哪个版本?
  • @Progman mongodb-driver-reactivestreams 4.0.5
  • 是否可以选择使用 mongodb-driver-sync 4.0.5?
  • @Progman 不,我们在几个月前从 mongodb-driver-sync 切换了所有内容,希望能够适应未来

标签: java mongodb-java bytebuffer reactor publisher


【解决方案1】:

spring 框架中有一个工具可以将输入流转换为数据缓冲区通量。并且直接将数据缓冲区映射为字节缓冲区。

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

【讨论】:

    【解决方案2】:

    为了让它工作,可以读取流并将数据存储在byte[] 数组中,稍后可以用ByteBuffer.wrap(byte[]) 方法包装。 我查看了旧版 MongoDB 驱动程序的源代码,发现流被用作实际流,所以当时它并没有在后台偷偷转换为 ByteBuffer。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-07-13
      • 2011-05-18
      • 2017-07-24
      • 1970-01-01
      • 2012-08-09
      • 1970-01-01
      • 2014-01-06
      • 1970-01-01
      相关资源
      最近更新 更多