菜单

数据缓冲区

相关源文件

数据缓冲区为Spring Framework中高效的字节流处理提供了响应式抽象。该系统提供对字节数据的统一访问,具有独立的读写位置、自动容量扩展以及与响应式流的无缝集成。与传统的ByteBuffer不同,数据缓冲区消除了翻转操作的需要,并为响应式编程模式提供了更便捷的API。

有关使用数据缓冲区的响应式Web技术的信息,请参阅WebFlux和响应式编程。有关资源抽象系统的详细信息,请参阅资源和I/O

核心接口和实现

DataBuffer接口定义了字节数据操作的主要抽象,并支持响应式流。系统提供了针对不同运行时环境优化的多种实现。

DataBuffer 接口架构

来源: spring-core/src/main/java/org/springframework/core/io/buffer/DataBuffer.java34-61 spring-core/src/main/java/org/springframework/core/io/buffer/DefaultDataBuffer.java44-61 spring-core/src/main/java/org/springframework/core/io/buffer/NettyDataBuffer.java40-56

工厂模式实现

工厂模式允许根据运行时要求和可用库创建不同的缓冲区实现。

来源: spring-core/src/main/java/org/springframework/core/io/buffer/DataBufferFactory.java22-30 spring-core/src/main/java/org/springframework/core/io/buffer/DefaultDataBufferFactory.java32-84 spring-core/src/main/java/org/springframework/core/io/buffer/NettyDataBufferFactory.java39-53

I/O 操作与实用工具

DataBufferUtils提供了全面的实用方法,用于通过响应式流集成来读取和写入各种I/O源。

I/O 操作流程

来源: spring-core/src/main/java/org/springframework/core/io/buffer/DataBufferUtils.java77-237 spring-core/src/main/java/org/springframework/core/io/buffer/DataBufferUtils.java259-379

读取操作

该实用类提供了多种将数据读入响应式流的方法

方法源类型描述
readInputStream()InputStream从输入流供应商读取
readByteChannel()ReadableByteChannel从NIO通道读取
readAsynchronousFileChannel()AsynchronousFileChannel异步文件读取
read(Resource)Spring Resource基于资源的读取,带自动检测
read(Path)文件 Path直接文件路径读取

所有读取操作都返回 Flux<DataBuffer> 用于响应式处理,并自动处理资源清理。

来源: spring-core/src/main/java/org/springframework/core/io/buffer/DataBufferUtils.java86-237

写入操作

写入操作使用 Publisher<DataBuffer> 并写入到各种目标

方法目标类型行为
write(OutputStream)OutputStream同步流写入
write(WritableByteChannel)WritableByteChannelNIO通道写入
write(AsynchronousFileChannel)AsynchronousFileChannel异步文件写入
write(Path)文件 Path带选项的直接文件写入

写入操作会保留返回的Flux中的原始缓冲区,并要求显式释放缓冲区。

来源: spring-core/src/main/java/org/springframework/core/io/buffer/DataBufferUtils.java259-379

内存管理

数据缓冲区系统通过池化和引用计数实现了复杂的内存管理,以实现高效的资源利用。

缓冲区生命周期管理

来源: spring-core/src/main/java/org/springframework/core/io/buffer/DataBufferUtils.java600-628 spring-core/src/main/java/org/springframework/core/io/buffer/NettyDataBuffer.java344-362

引用计数与池化

池化的数据缓冲区实现引用计数以跟踪使用情况并实现安全共享

  • 保留retain() 增加引用计数以供共享访问
  • 释放release() 递减计数并在计数为零时将缓冲区返回到池中
  • 标记touch(Object) 关联提示以进行泄漏跟踪
  • 分配检查isAllocated() 验证缓冲区是否仍然有效

DataBufferUtils.release() 方法提供跨不同缓冲区类型的安全释放处理。

来源: spring-core/src/main/java/org/springframework/core/io/buffer/DataBufferUtils.java573-628

缓冲区实现

DefaultDataBuffer

默认实现使用标准的Java ByteBuffer,具有独立的读写位置

  • 后端存储:带有位置跟踪的单个 ByteBuffer
  • 容量管理:使用倍增策略自动扩容
  • 内存类型:可配置的堆内存或直接分配
  • 线程安全:非线程安全,需要外部同步

主要特性包括高效的 split() 操作和 ByteBuffer 集成方法。

来源: spring-core/src/main/java/org/springframework/core/io/buffer/DefaultDataBuffer.java44-99

NettyDataBuffer

封装Netty的 ByteBuf,用于与基于Netty的应用集成

  • 后端存储:Netty ByteBuf,具有完整功能访问
  • 池化:利用Netty的池化缓冲区分配器
  • 引用计数:原生Netty引用计数支持
  • 性能:针对高吞吐量场景进行优化

通过 getNativeBuffer() 提供对底层 ByteBuf 的直接访问。

来源: spring-core/src/main/java/org/springframework/core/io/buffer/NettyDataBuffer.java40-65

JettyDataBuffer

与Jetty的 Content.Chunk 集成,用于基于Jetty的环境

  • 后端存储:Jetty Content.Chunk 包装器
  • 生命周期:实现 CloseableDataBuffer 用于资源清理
  • 集成:无缝集成Jetty HTTP服务器
  • 内存管理:委托给Jetty的缓冲区池

来源: spring-core/src/main/java/org/springframework/core/io/buffer/JettyDataBuffer.java29-61

与响应式流的集成

数据缓冲区与Project Reactor和响应式编程模式无缝集成。

流处理操作

该实用类提供了用于缓冲区操作的响应式运算符

操作目的返回类型
takeUntilByteCount(Publisher, long)限制消耗的总字节数Flux<T>
skipUntilByteCount(Publisher, long)跳过初始字节Flux<T>
join(Publisher)合并多个缓冲区Mono<DataBuffer>
outputStreamPublisher()从OutputStream创建PublisherPublisher<DataBuffer>
subscriberInputStream()从Publisher创建InputStreamInputStream

这些操作处理自动缓冲区释放并提供背压支持。

来源: spring-core/src/main/java/org/springframework/core/io/buffer/DataBufferUtils.java498-556 spring-core/src/main/java/org/springframework/core/io/buffer/DataBufferUtils.java441-482

模式匹配

Matcher 接口支持高效的基于分隔符的流处理

匹配器系统通过针对不同分隔符长度的专用实现来优化分隔符检测,并支持同时处理多个分隔符。

来源: spring-core/src/main/java/org/springframework/core/io/buffer/DataBufferUtils.java725-965