我正在异步获取未知数量的ByteBuffer(它们通过网络发送).每个都包含一部分数据,它们以正确的顺序到达.我想重新组装它们,并将重新联合的数据传递给处理程序.但是,在最后一个到达之前,它们不能保存在内存中,因为它可以是许多兆字节.

因此,我的 idea 是,将InputStream传递给该数据的处理程序,处理程序可以从该处理程序中连续读取数据并进行动态处理,例如写入磁盘.由于InputStream不能写入,我可以使用PipedOutputStream,并将其连接到PipedInputStream.不过,这涉及到大量的复制(PipedInputStream有自己的缓冲区,然后通过复制到数组来再次读取),所以我担心性能.

这是个好主意吗?我是否应该使用不同于流的技术,例如频道?

推荐答案

我会将ByteBuffer直接发送到接收器.接收方可以实现Flow.Subscriber<List<ByteBuffer>>,就像HttpResponse.BodySubscriber个实现一样.

这允许您的代码创建一个SubmissionPublisher(我所知道的唯一的Flow.Publisher的Java SE实现),并将接收订户添加到其中:

    SubmissionPublisher<List<ByteBuffer>> publisher =
        new SubmissionPublisher<>();

    // ...

    Flow.Subscriber<List<ByteBuffer>> handler = /* ... */;
    publisher.subscribe(handler);

    // ...

    while (dataAvailable) {
        List<ByteBuffer> partialData = /* ... */;
        publisher.submit(partialData);
    }

SubmissionPublisher在如何创建提交线程以及如何处理接收方异常方面有许多选项.

Java相关问答推荐

是否需要关闭Executors返回的执行器.newVirtualThreadPerTaskExecutor()?

Java 21虚拟线程会解决转向react 式单线程框架的主要原因吗?

即使我正在使用并发方法,使用Javascript的应用程序也会继续冻结'

Java模式匹配记录

如何调用Firebase Realtime Database中的子图像列表到android studio中的回收器视图?

如何使用AWS CLI从S3存储桶中的所有对象中删除用户定义的元数据?

所有 case 一起输入时输出错误,而单独放置时输出正确

SpringBoot+Java 17@Valid未验证POJO

当返回Mono<;Something>;时,不会调用Mono<;void>;.flatMap

Mac上的全屏截图在使用JavaFX时不能正常工作吗?

MySQL数据库中未应用具有Spring数据的唯一约束

S,要对Java复制构造函数深度克隆所有属性进行单元测试,最可靠的方法是什么?

Tinylog中的滚动文件会在每次应用启动时覆盖日志(log)文件

如何在代码中将行呈现在矩形前面?

接受类及其接口的Java类型(矛盾)

活泼的一次判断成语,结果中等

Java System.getProperty在哪里检索user.home?

Java递归泛型是否可以被视为继承和重写的语法糖

Cucumber中第二个网页的类对象未初始化

Xml Reader 将 BMP 外部的字符解析为代理项对,这会导致无效的 xml