DNA에 언급되어 있듯이 미리 채워진 버퍼를 가지고 ByteBuffer.put(ByteBuffer)
을 사용하면 아마도 가장 빠른 휴대용 방법 일 것입니다.
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 구현과 플랫폼에 대한 약간의 지식이 필요합니다 그 실용적이지의 경우, 해당되는 경우 Arrays.fill
또는 Unsafe.putLong
중 하나를 활용하기 위해이 같은 일을 할 수 있습니다. 다음은 JAC (을 편리한 표준 방법으로 os.arch
시스템 속성에 액세스하도록 제공)을 사용하는 경우 Oracle JRE 용으로 설정하는 방법입니다.
/**
* 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");
더 자세히 설명 할 수 있습니까? 바이트 버퍼를 어떻게 얻습니까? – jontro
버퍼를 제로화해야한다고 생각하는 이유는 무엇입니까? – EJP
직접 버퍼입니까? 그렇지 않다면, 단지 ByteBuffer.wrap (new byte [123456]);은 무엇 이냐? –