buffer(int)和buffer()有什么区别?

时间:2018-08-31 17:29:12

标签: java netty

我正在尝试将数据包发送到客户端,我注意到即使我没有设置初始容量也没有错误。

// data is another ByteBuf object
// With capacity
ByteBuf d = Unpooled.buffer(2 + data.array().length);
d.writeByte(identifiers[0]).writeByte(identifiers[1]).writeBytes(data.array());
// Without capacity
ByteBuf d = Unpooled.buffer();
d.writeByte(identifiers[0]).writeByte(identifiers[1]).writeBytes(data.array());

两者之间有什么区别吗?他们俩似乎都工作正常。

我还想知道我是否做对了,我正在使用ByteBuf创建一个新的Unpooled.buffer,在其中写入我的数据,并在发生以下情况时使用channel.write(ByteBuf)将其发送到频道我需要发送一些东西给客户。我做对了吗?

3 个答案:

答案 0 :(得分:4)

docs:

  • public class MediaActivity { private MediaBrowserCompat mMediaBrowserCompat; @Override public void onCreate() { super.onCreate(savedInstanceState); mMediaBrowserCompat = new MediaBrowserCompat( this, new ComponentName(this, MediaPlayerService.class), mMediaBrowserCompatConnectionCallback, getIntent().getExtras() ); mMediaBrowserCompat.connect(); } } private MediaBrowserCompat.ConnectionCallback mMediaBrowserCompatConnectionCallback = new MediaBrowserCompat.ConnectionCallback() { @Override public void onConnected() { super.onConnected(); final MediaControllerCompat mcc = new MediaControllerCompat(MediaActivity.this, mMediaBrowserCompat.getSessionToken()); mcc.registerCallback(mMediaControllerCompatCallback); MediaControllerCompat.setMediaController(mActivity, mcc); } }; public class MediaPlayerService extends MediaBrowserServiceCompat { @Override public void onCreate() { super.onCreate(); //Should I add a startForeground notification here } } private MediaSessionCompat.Callback mMediaSessionCallback = new MediaSessionCompat.Callback() { @Override public void onPlay() { super.onPlay(); final NotificationManager manager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); final NotificationCompat.Builder builder = new NotificationCompat.Builder(this, channelID) ... startForeground(101, builder.build()); } @Override public void onPause() { super.onPause(); } };
      

    创建一个新的big-endian Java堆缓冲区,其初始容量相当小,可以根据需要无限扩展其容量。

  • buffer()
      

    用指定的容量创建一个新的big-endian Java堆缓冲区,根据需要无限扩展其容量。新缓冲区的readerIndex和writerIndex为0。

因此,buffer(int initialCapacity)buffer(int)做相同的事情,但是具有指定的起始容量。如果您知道需要的容量比默认容量大,它将更好地执行,因为如果没有足够的容量,则不必继续扩展。 编辑:同样,如@yelliver所述,您可以通过指定来节省内存,具体取决于您创建的缓冲区对象数(或取决于缓冲区的大小)。

buffer()似乎还设置了buffer(int)可能没有的一些索引。

答案 1 :(得分:1)

不同之处在于它们具有不同的初始容量。

请参见buffer()文档:

  

创建一个新的big-endian Java堆缓冲区,其较小   初始容量,可以根据需要无限扩展容量。

buffer(int initialCapacity)文档:

  

使用指定容量创建一个新的大端Java堆缓冲区,   可以根据需要无限扩展其容量。

答案 2 :(得分:0)

在一般的Java中,很多情况下您可以传递容量或不传递容量,两者都可以。如果您不通过该容量,它将具有默认容量,当容量已满时,它将自动扩展。例如:

String[] arr = list.toArray(new String[list.size()]);
//OR
String[] arr = list.toArray(new String[0]);

List<String> list = new ArrayList<>(10);
//OR
List<String> list = new ArrayList<>();

如果您使用默认容量:

  1. 专业人士:无需担心容量(显然)
  2. 缺点:如果您有意 使用小于默认容量的小尺寸,将会浪费 记忆。

如果您通过了意图能力:

  1. 优点:节省内存,您可以精确分配所需的内存。
  2. 缺点:有时您可能从一开始就不知道确切的尺寸,或者尺寸的计算很复杂