正如 DNA 所提到的,预先填充缓冲液并使用ByteBuffer.put(ByteBuffer)
可能是最快的便携方式。如果这不切实际,您可以做这样的事情来利用其中一个Arrays.fill
或Unsafe.putLong
在适用时:
public static void fill(ByteBuffer buf, byte b) {
if (buf.hasArray()) {
final int offset = buf.arrayOffset();
Arrays.fill(buf.array(), offset + buf.position(), offset + buf.limit(), b);
buf.position(buf.limit());
} else {
int remaining = buf.remaining();
if (UNALIGNED_ACCESS) {
final int i = (b << 24) | (b << 16) | (b << 8) | b;
final long l = ((long) i << 32) | i;
while (remaining >= 8) {
buf.putLong(l);
remaining -= 8;
}
}
while (remaining-- > 0) {
buf.put(b);
}
}
}
设置UNALIGNED_ACCESS
需要对您的 JRE 实现和平台有所了解。下面是我在使用 JNA 时为 Oracle JRE 设置它的方法(它提供Platform.ARCH
了一种方便、规范的方式来访问os.arch
系统属性)。
/**
* Indicates whether the ByteBuffer implementation likely supports unaligned
* access of multi-byte values on the current platform.
*/
private static final boolean UNALIGNED_ACCESS = Platform.ARCH.startsWith("x86");