本文整理了Java中org.apache.mina.common.ByteBuffer
类的一些代码示例,展示了ByteBuffer
类的具体用法。这些代码示例主要来源于Github
/Stackoverflow
/Maven
等平台,是从一些精选项目中提取出来的代码,具有较强的参考意义,能在一定程度帮忙到你。ByteBuffer
类的具体详情如下:
包路径:org.apache.mina.common.ByteBuffer
类名称:ByteBuffer
[英]A byte buffer used by MINA applications.
This is a replacement for java.nio.ByteBuffer. Please refer to java.nio.ByteBuffer and java.nio.Buffer documentation for usage. MINA does not use NIO java.nio.ByteBuffer directly for two reasons:
fill
, get/putString
, and get/putAsciiInt()
enough.Allocation
You can get a heap buffer from buffer pool:
ByteBuffer buf = ByteBuffer.allocate(1024, false);
you can also get a direct buffer from buffer pool:
ByteBuffer buf = ByteBuffer.allocate(1024, true);
or you can let MINA choose:
ByteBuffer buf = ByteBuffer.allocate(1024);
Acquire/Release
Please note that you never need to release the allocated buffer because MINA will release it automatically when:
You have to release buffers manually by calling #release() when:
Wrapping existing NIO buffers and arrays
This class provides a few wrap(...) methods that wraps any NIO buffers and byte arrays. Wrapped MINA buffers are not returned to the buffer pool by default to prevent unexpected memory leakage by default. In case you want to make it pooled, you can call #setPooled(boolean)with true flag to enable pooling.
AutoExpand
Writing variable-length data using NIO ByteBuffers is not really easy, and it is because its size is fixed. MINA ByteBuffer introduces autoExpand property. If autoExpand property is true, you never get BufferOverflowException or IndexOutOfBoundsException (except when index is negative). It automatically expands its capacity and limit value. For example:
String greeting = messageBundle.getMessage( "hello" );
ByteBuffer buf = ByteBuffer.allocate( 16 );
// Turn on autoExpand (it is off by default)
buf.setAutoExpand( true );
buf.putString( greeting, utf8encoder );
NIO ByteBuffer is reallocated by MINA ByteBuffer behind the scene if the encoded data is larger than 16 bytes. Its capacity will increase by two times, and its limit will increase to the last position the string is written.
Derived Buffers
Derived buffers are the buffers which were created by #duplicate(), #slice(), or #asReadOnlyBuffer(). They are useful especially when you broadcast the same messages to multiple IoSessions. Please note that the derived buffers are neither pooled nor auto-expandable. Trying to expand a derived buffer will raise IllegalStateException.
Changing Buffer Allocation and Management Policy
MINA provides a ByteBufferAllocator interface to let you override the default buffer management behavior. There are two allocators provided out-of-the-box:
fill
、get/putString
和get/putAsciiInt()
。ByteBuffer buf = ByteBuffer.allocate(1024, false);
您也可以从缓冲池获得直接缓冲:<
ByteBuffer buf = ByteBuffer.allocate(1024, true);
或者您可以让MINA选择:<<
ByteBuffer buf = ByteBuffer.allocate(1024);
获取/发布
请注意,您永远不需要释放分配的缓冲区,因为MINA将在以下情况下自动释放它:
*通过调用IoSession#write(Object)来传递缓冲区。
*通过调用IoFilter传递缓冲区。NextFilter#filterWrite(IoSession,IoFilter.WriterRequest)。
*通过调用ProtocolEncoderOutput#write(ByteBuffer)传递缓冲区。
而且,您不需要释放任何作为IoHandler#messageReceived(IoSession,Object)方法参数传递的ByteBuffer。当方法返回时,它们会自动释放。
在以下情况下,必须通过调用#release()手动释放缓冲区:
*您分配了一个缓冲区,但没有将缓冲区传递给上述两种方法中的任何一种。
*您调用了#acquire()以防止释放缓冲区。
包装现有NIO缓冲区和阵列
此类提供了一些换行(…)方法包装任何NIO缓冲区和字节数组。默认情况下,包装的MINA缓冲区不会返回到缓冲池,以防止意外的内存泄漏。如果要使其成为池,可以使用true标志调用#setPooled(布尔值)以启用池。
自动扩展
使用NIO ByteBuffers编写可变长度数据并不容易,因为它的大小是固定的。MINA ByteBuffer引入了自动扩展属性。若autoExpand属性为true,则永远不会获得BufferOverflowException或IndexOutOfBoundsException(索引为负时除外)。它会自动扩展其容量和限制值。例如:
String greeting = messageBundle.getMessage( "hello" );
ByteBuffer buf = ByteBuffer.allocate( 16 );
// Turn on autoExpand (it is off by default)
buf.setAutoExpand( true );
buf.putString( greeting, utf8encoder );
如果编码数据大于16字节,则NIO ByteBuffer将由MINA ByteBuffer在幕后重新分配。其容量将增加两倍,其限制将增加到写入字符串的最后位置。
派生缓冲区
派生缓冲区是由#duplicate()、#slice()或#asReadOnlyBuffer()创建的缓冲区。它们非常有用,尤其是当您向多个会话广播相同的消息时。请注意,派生缓冲区既不是池也不是自动扩展的。尝试扩展派生缓冲区将引发IllegalStateException。
更改缓冲区分配和管理策略
MINA提供了一个ByteBufferAllocator接口,允许您覆盖默认的缓冲区管理行为。有两个现成的分配器:
*PooledByteBufferAllocator(默认)
*SimpleByteBufferAllocator
您可以通过调用#setAllocator(ByteBufferAllocator)来更改分配器。
代码示例来源:origin: apache/incubator-dubbo
@Override
public void decode(IoSession session, ByteBuffer in, ProtocolDecoderOutput out) throws Exception {
int readable = in.limit();
if (readable <= 0) {
return;
buffer.writeBytes(in.buf());
frame = buffer;
} else {
int size = buffer.readableBytes() + in.remaining();
frame = ChannelBuffers.dynamicBuffer(size > bufferSize ? size : bufferSize);
frame.writeBytes(buffer, buffer.readableBytes());
frame.writeBytes(in.buf());
frame = ChannelBuffers.wrappedBuffer(in.buf());
代码示例来源:origin: apache/incubator-dubbo
@Override
public void encode(IoSession session, Object msg, ProtocolEncoderOutput out) throws Exception {
ChannelBuffer buffer = ChannelBuffers.dynamicBuffer(1024);
MinaChannel channel = MinaChannel.getOrAddChannel(session, url, handler);
try {
codec.encode(channel, buffer, msg);
} finally {
MinaChannel.removeChannelIfDisconnected(session);
}
out.write(ByteBuffer.wrap(buffer.toByteBuffer()));
out.flush();
}
}
代码示例来源:origin: org.apache.directory.mina/mina-core
private void readSession( DatagramSessionImpl session )
{
ByteBuffer readBuf = ByteBuffer.allocate( session.getReadBufferSize() );
try
{
int readBytes = session.getChannel().read( readBuf.buf() );
if( readBytes > 0 )
{
readBuf.flip();
ByteBuffer newBuf = ByteBuffer.allocate( readBuf.limit() );
newBuf.put( readBuf );
newBuf.flip();
session.increaseReadBytes( readBytes );
( ( DatagramFilterChain ) session.getFilterChain() ).messageReceived( session, newBuf );
}
}
catch( IOException e )
{
( ( DatagramFilterChain ) session.getFilterChain() ).exceptionCaught( session, e );
}
finally
{
readBuf.release();
}
}
代码示例来源:origin: org.apache.directory.mina/mina-core
ByteBuffer tmp = ByteBuffer.allocate( 2 ).setAutoExpand( true );
tmp.putString( delimiter.getValue(), charset.newEncoder() );
tmp.flip();
delimBuf = tmp;
int oldPos = in.position();
int oldLimit = in.limit();
while( in.hasRemaining() )
byte b = in.get();
if( delimBuf.get( matchCount ) == b )
if( matchCount == delimBuf.limit() )
int pos = in.position();
in.limit( pos - matchCount + oldMatchCount );
in.position( oldPos );
buf.put( in );
if( buf.position() > maxLineLength )
throw new BufferDataException( "Line is too long: " + buf.position() );
buf.flip();
out.write( buf.getString( decoder ) );
buf.clear();
in.limit( oldLimit );
in.position( pos );
代码示例来源:origin: org.reddwarfserver.client/sgs-client
private void processReceiveBuffer(FilterListener listener) {
if (msgBuf.remaining() > MAX_BUFFER_SIZE) {
logger.log(Level.WARNING,
"Recv filter buffer is larger than expected: {0,number,#}",
msgBuf.remaining());
while (msgBuf.hasRemaining()) {
if (msgBuf.remaining() < 2) {
break;
if (!msgBuf.prefixedDataAvailable(2)) {
break;
int msgLen = msgBuf.getShort() & 0xFFFF;
msgBuf.slice().asReadOnlyBuffer().limit(msgLen);
msgBuf.skip(msgLen);
msgBuf.compact();
msgBuf.position());
代码示例来源:origin: org.apache.directory.mina/mina-core
public boolean equals( Object o )
{
if( !( o instanceof ByteBuffer ) )
{
return false;
}
ByteBuffer that = (ByteBuffer)o;
if( this.remaining() != that.remaining() )
{
return false;
}
int p = this.position();
for( int i = this.limit() - 1, j = that.limit() - 1; i >= p; i --, j -- )
{
byte v1 = this.get( i );
byte v2 = that.get( j );
if( v1 != v2 )
{
return false;
}
}
return true;
}
代码示例来源:origin: org.apache.directory.mina/mina-core
int oldPos = in.position();
int oldLimit = in.limit();
while( in.hasRemaining() )
byte b = in.get();
boolean matched = false;
switch( b )
int pos = in.position();
in.limit( pos - matchCount + oldMatchCount );
in.position( oldPos );
buf.put( in );
if( buf.position() > maxLineLength )
throw new BufferDataException( "Line is too long: " + buf.position() );
buf.flip();
out.write( buf.getString( decoder ) );
buf.clear();
in.limit( oldLimit );
in.position( pos );
oldPos = pos;
matchCount = 0;
in.position( oldPos );
in.limit( in.limit() - matchCount + oldMatchCount );
buf.put( in );
代码示例来源:origin: org.apache.directory.server/mitosis
public final void encode( IoSession session, Object in, ProtocolEncoderOutput out ) throws Exception
{
BaseMessage m = ( BaseMessage ) in;
ByteBuffer buf = ByteBuffer.allocate( 16 );
buf.setAutoExpand( true );
buf.put( ( byte ) m.getType() );
buf.putInt( m.getSequence() );
buf.putInt( 0 ); // placeholder for body length field
final int bodyStartPos = buf.position();
encodeBody( m, buf );
final int bodyEndPos = buf.position();
final int bodyLength = bodyEndPos - bodyStartPos;
// fill bodyLength
buf.position( bodyStartPos - 4 );
buf.putInt( bodyLength );
buf.position( bodyEndPos );
buf.flip();
out.write( buf );
}
代码示例来源:origin: org.apache.directory.mina/mina-core
sum += ( ( ByteBuffer ) bufferQueue.get( i ) ).remaining();
ByteBuffer newBuf = ByteBuffer.allocate( sum );
newBuf.put( buf );
buf.release();
newBuf.flip();
bufferQueue.push(newBuf);
代码示例来源:origin: org.apache.directory.mina/mina-core
rb.mark();
byteCount = rb.remaining();
ByteBuffer wb = ByteBuffer.allocate( rb.remaining() );
wb.put( rb );
wb.flip();
rb.reset();
messageCopy = wb;
代码示例来源:origin: org.apache.directory.mina/mina-core
private void storeRemainingInSession(ByteBuffer buf, IoSession session)
{
ByteBuffer remainingBuf = ByteBuffer.allocate( buf.remaining() );
remainingBuf.setAutoExpand( true );
remainingBuf.put( buf );
session.setAttribute( BUFFER, remainingBuf );
}
}
代码示例来源:origin: org.reddwarfserver.client/sgs-client
/**
* Processes network data of arbitrary length and dispatches zero or
* more complete messages to the given {@code listener}. If a partial
* message remains, it is buffered until more data is received.
*
* @param listener the {@code FilterListener} to receive complete messages
* @param buf the data to filter and optionally deliver to the
* {@code FilterListener}
*/
void filterReceive(FilterListener listener, ByteBuffer buf) {
logger.log(Level.FINEST,
"processing {0,number,#} bytes",
buf.remaining());
// Append the new data to the buffer
msgBuf.expand(buf.remaining());
msgBuf.put(buf);
msgBuf.flip();
processReceiveBuffer(listener);
}
代码示例来源:origin: org.apache.directory.mina/mina-core
public int read( byte[] b, int off, int len )
{
int remaining = ByteBuffer.this.remaining();
if( remaining > 0 )
{
int readBytes = Math.min( remaining, len );
ByteBuffer.this.get( b, off, readBytes );
return readBytes;
}
else
{
return -1;
}
}
代码示例来源:origin: org.apache.mina/mina-filter-ssl
/**
* Creates a new Mina byte buffer that is a deep copy of the remaining bytes
* in the given buffer (between index buf.position() and buf.limit())
*
* @param src the buffer to copy
* @return the new buffer, ready to read from
*/
public static org.apache.mina.common.ByteBuffer copy(java.nio.ByteBuffer src) {
org.apache.mina.common.ByteBuffer copy = org.apache.mina.common.ByteBuffer
.allocate(src.remaining());
copy.put(src);
copy.flip();
return copy;
}
代码示例来源:origin: org.apache.directory.mina/mina-core
public int compareTo( Object o )
{
ByteBuffer that = (ByteBuffer)o;
int n = this.position() + Math.min( this.remaining(), that.remaining() );
for( int i = this.position(), j = that.position(); i < n; i ++, j ++ )
{
byte v1 = this.get( i );
byte v2 = that.get( j );
if( v1 == v2 )
{
continue;
}
if( v1 < v2 )
{
return -1;
}
return +1;
}
return this.remaining() - that.remaining();
}
代码示例来源:origin: org.apache.directory.mina/mina-core
public void encode( IoSession session, Object message, ProtocolEncoderOutput out ) throws Exception
{
if( !( message instanceof Serializable ) )
{
throw new NotSerializableException();
}
ByteBuffer buf = ByteBuffer.allocate( 64 );
buf.setAutoExpand( true );
buf.putObject( message );
int objectSize = buf.position() - 4;
if( objectSize > maxObjectSize )
{
buf.release();
throw new IllegalArgumentException( "The encoded object is too big: " + objectSize + " (> " + maxObjectSize + ')' );
}
buf.flip();
out.write( buf );
}
}
代码示例来源:origin: org.apache.directory.mina/mina-core
public int hashCode()
{
int h = 1;
int p = position();
for( int i = limit() - 1; i >= p; i -- )
{
h = 31 * h + get( i );
}
return h;
}
代码示例来源:origin: org.apache.directory.mina/mina-core
private void read( SocketSessionImpl session )
ByteBuffer buf = ByteBuffer.allocate( session.getReadBufferSize() );
SocketChannel ch = session.getChannel();
buf.clear();
while( ( ret = ch.read( buf.buf() ) ) > 0 )
buf.flip();
buf.release();
代码示例来源:origin: org.apache.directory.mina/mina-core
if( buf.remaining() == 0 )
buf.reset();
( ( SocketFilterChain ) session.getFilterChain() ).messageSent( session, req );
continue;
int writtenBytes = ch.write( buf.buf() );
if( writtenBytes > 0 )
if( buf.hasRemaining() )
代码示例来源:origin: org.apache.directory.mina/mina-core
public void encode( IoSession session, Object message,
ProtocolEncoderOutput out )
throws Exception
{
CharsetEncoder encoder = ( CharsetEncoder ) session.getAttribute( ENCODER );
if( encoder == null )
{
encoder = charset.newEncoder();
session.setAttribute( ENCODER, encoder );
}
String value = message.toString();
ByteBuffer buf = ByteBuffer.allocate( value.length() ).setAutoExpand( true );
buf.putString( value, encoder );
if( buf.position() > maxLineLength )
{
throw new IllegalArgumentException( "Line length: " + buf.position() );
}
buf.putString( delimiter.getValue(), encoder );
buf.flip();
out.write( buf );
}
内容来源于网络,如有侵权,请联系作者删除!