我创建了一个名为
LocalChunkSender
的类,实现了一个名为 ChunkSender
的接口。
ChunkSender
为其他类公开一个 16KB ByteBuffer
以填充数据,然后将此缓冲区写入一个 java.nio.channels.WritableByteChannel
,后者写入本地文件(chunk-file)。
当另一个类确定足够的字节已存储到当前块文件中时,它命令 ChunkSender 关闭当前块文件,打开一个新文件,故事继续进行。
以下是抽象 BaseChunkSender 的关键方法:
@Override
public void sendChunkBuffer(DataChunk chunk) throws IOException {
if (currentChunk == null) {
currentChunk = chunk;
checkSum = 0;
checkedOutputStream = new CheckedOutputStream(createChunkStream(chunk), new CRC32());
outChannel = Channels.newChannel(checkedOutputStream);
}
outChannel.write(buffer);
buffer.clear();
}
protected abstract OutputStream createChunkStream(DataChunk chunk) throws IOException;
createChunkStream()
方法由LocalChunkSender
实现,并提供OutputStream
供WritableByteChannel
使用。
现在我想制作另一个 ChunkSender 实现,通过 POST 将 ByteBuffer 数据发送到远程 REST 服务。 我想我应该使用由
org.springframework.http.RequestEntity<InputStreamResource>
构造的 org.springframework.core.io.InputStreamResource
,但问题是:
我的 ChunkSender
没有任何 InputStream
用于 InputStreamResource
因为通过其 16KB ByteBuffer
接收数据,这应该写在 WritableByteChannel
中。
我想避免将完整的块文件存储在内存中,或作为临时文件,然后在 POST 中将其作为普通MultiPartFile
发送,因为这会占用太多内存和时间。
所以我的问题是:构建一个由
InputStreamResource
循环喂养的 ByteBuffer
然后使用它(即使在单独的线程中)来制作 RequestEntity
的主体是否可能且合理?
或者有什么更好的解决方案吗?
我已经搜索过类似的问题,关于将数据流式传输到 POST 上传中,但是所有示例都从
InputStream
(例如从本地文件)中获取 RequestEntity 主体的字节