数据报包中的ByteBuffer vs. Buffer

4

我读过ByteBuffer(java.nio)比Buffer类更高效,因此在读取数据时应该使用它。我的问题是关于一个从多播地址读取数据包并将其转换为基本对象的UDP客户端。什么是从DatagramSocket解析这些数据包的最有效/最快的方法?目前,我有一个数据报包,我在其中包装了一个ByteBuffer字节数组,并从那里读取。我的目标是尽量减少新对象的创建,最大化速度。


5
我认为将这个问题提交到stackoverflow.com会更加合适。 - Adam Lear
2个回答

4

DatagramSocket无法直接读取ByteBuffer,但是您可以使用DatagramChannel来实现此功能。


DatagramSocket可以直接(如果“直接”意味着零拷贝)接收到ByteBuffer中。您可以创建一个包装ByteBuffer的DatagramPacket。您可以接收(),然后从ByteBuffer中读取数据。构建数据包和发送也是如此。 - charstar
@charstar,我认为这不正确。DatagramPacket 构造函数都采用 byte[],而不是 ByteBuffer。您只能获取缓冲区的支持数组(backing array)(如果有的话),而 直接字节缓冲区 不会有支持数组。 - finnw

0

我认为ByteBuffer的使用仅仅是因为Buffer在程序员的角度下没有足够的功能来使访问高效,而不是出于效率考虑。我怀疑效率上是否有差异,因为底层代码大部分都是重复的。

需要注意的是,无论哪种方式比使用简单的字节数组更有效并不总是清楚的 - NIO性能很容易被误估。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接