spring-core io包DataBuffer,PoolDataBuffer,DataBufferFactory接口源碼解析

一、接口繼承圖

二、接口類功能概述和實現

DataBuffer是對java NIO中的ByteBuffer 和Netty的ByteBuf 的統一包裝,包含對字節緩衝區操作的各種方法,如下:

      

      DefaultDataBuffer是DataBuffer的默認實現,基於java NIO的ByteBuffer實現, 相關ByteBuffer的操作參考:

       https://blog.csdn.net/shuaiAWP/article/details/51915983

      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);
}


 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章