spring-core io包DataBuffer,PoolDataBuffer,DataBufferFactory介面
一、介面繼承圖
二、介面類功能概述和實現
DataBuffer是對java NIO中的ByteBuffer 和Netty的ByteBuf 的統一包裝,包含對位元組緩衝區操作的各種方法,如下:
DefaultDataBuffer是DataBuffer的預設實現,基於java NIO的ByteBuffer實現, 相關ByteBuffer的操作參考:
PooledDataBuffer繼承DataBuffer介面,增加了引用計數的方法,保留方法將引用計數增加1。 釋放方法將計數減1,並在計數達到0時釋放緩衝區的記憶體,增加的方法如下:
NettyDataBuffer是PooledDataBuffer的唯一實現,基於Netty 的ByteBuf實現。
DataBufferFactory介面提供了用於構造DataBuffer的方法,如下所示:
其中join方法用於將多個DataBuffer做合併處理。DefaultDataBufferFactory是DefaultDataBuffer的工廠類,NettyDataBufferFactory是NettyDataBuffer的工廠類。
DataBufferUtils是DataBuffer介面的工具類,它包含從InputStream或NIO通道讀取DataBuffer物件的Flux的方法,以及將資料緩衝區Flux寫入OutputStream或Channel的方法等。但是該工具類是基於反應式程式設計框架Reactor中的Flux元素寫的,Reactor參考如下:https://www.ibm.com/developerworks/cn/java/j-cn-with-reactor-response-encode/index.html?lnk=hmhm
參考測試用例如下:
@Test public void writeAndRead() throws Exception{ DataBufferFactory dataBufferFactory=new DefaultDataBufferFactory(); DataBuffer buffer = dataBufferFactory.allocateBuffer(2); buffer.write(new byte[]{'a', 'b', 'c'}); System.out.println("capacity-->"+buffer.capacity()); System.out.println("readPosition-->"+buffer.readPosition()); System.out.println("writePosition-->"+buffer.writePosition()); System.out.println("writableByteCount-->"+buffer.writableByteCount()); System.out.println("readableByteCount-->"+buffer.readableByteCount()); int index=buffer.indexOf(p -> p=='c', 1); System.out.println("index-->"+index); int ch = buffer.read(); assertEquals('a', ch); buffer.readPosition(2); ch = buffer.read(); assertEquals('c', ch); buffer.write((byte) 'd'); buffer.write((byte) 'e'); byte[] result = new byte[2]; buffer.read(result); assertArrayEquals(new byte[]{'d', 'e'}, result); ByteBuffer buffer2=ByteBuffer.allocate(4); buffer2.put((byte) '1'); buffer2.put((byte) '2'); buffer2.put((byte) '3'); buffer2.put((byte) '4'); buffer2.position(2); System.out.println("write before writePosition-->"+buffer.writePosition()); buffer.write(buffer2); System.out.println("write after writePosition-->"+buffer.writePosition()); ByteBuffer buffer3=buffer.asByteBuffer(4, 5); ch = buffer3.get(); assertEquals('e', ch); assertEquals(5,buffer3.limit()); InputStream in=buffer.asInputStream(); in.read(result); assertArrayEquals(new byte[]{'3', '4'}, result); DataBufferUtils.release(buffer); } @Test public void retainAndRelease() { NettyDataBufferFactory dataBufferFactory=new NettyDataBufferFactory(new PooledByteBufAllocator()); PooledDataBuffer buffer = dataBufferFactory.allocateBuffer(4); // buffer.write((byte) 'a'); buffer.retain(); boolean result = buffer.release(); assertFalse(result); result = buffer.release(); assertTrue(result); }
三、ResourcePatternResolver和PropertySourceFactory介面