数据缓冲区为Spring Framework中高效的字节流处理提供了响应式抽象。该系统提供对字节数据的统一访问,具有独立的读写位置、自动容量扩展以及与响应式流的无缝集成。与传统的ByteBuffer不同,数据缓冲区消除了翻转操作的需要,并为响应式编程模式提供了更便捷的API。
有关使用数据缓冲区的响应式Web技术的信息,请参阅WebFlux和响应式编程。有关资源抽象系统的详细信息,请参阅资源和I/O。
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
DataBufferUtils提供了全面的实用方法,用于通过响应式流集成来读取和写入各种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) | WritableByteChannel | NIO通道写入 |
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
默认实现使用标准的Java ByteBuffer,具有独立的读写位置
ByteBuffer主要特性包括高效的 split() 操作和 ByteBuffer 集成方法。
来源: spring-core/src/main/java/org/springframework/core/io/buffer/DefaultDataBuffer.java44-99
封装Netty的 ByteBuf,用于与基于Netty的应用集成
ByteBuf,具有完整功能访问通过 getNativeBuffer() 提供对底层 ByteBuf 的直接访问。
来源: spring-core/src/main/java/org/springframework/core/io/buffer/NettyDataBuffer.java40-65
与Jetty的 Content.Chunk 集成,用于基于Jetty的环境
Content.Chunk 包装器CloseableDataBuffer 用于资源清理来源: 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创建Publisher | Publisher<DataBuffer> |
subscriberInputStream() | 从Publisher创建InputStream | InputStream |
这些操作处理自动缓冲区释放并提供背压支持。
来源: 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