Java Language
ByteBuffer
수색…
소개
ByteBuffer
클래스는 Java 1.4에서 도입되어 바이너리 데이터 작업을 쉽게합니다. 원시 타입 데이터와 함께 사용하기에 특히 적합합니다. 그것은 생성을 허용하지만 더 높은 추상화 레벨에서 byte[]
의 후속적인 조작
통사론
- byte [] arr = 새로운 바이트 [1000];
- ByteBuffer buffer = ByteBuffer.wrap (arr);
- ByteBuffer buffer = ByteBuffer.allocate (1024);
- ByteBuffer buffer = ByteBuffer.allocateDirect (1024);
- 바이트 b = buffer.get ();
- 바이트 b = buffer.get (10);
- 짧은 s = buffer.getShort (10);
- buffer.put ((byte) 120);
- buffer.putChar ( 'a');
기본 사용법 - ByteBuffer 만들기
ByteBuffer
는 두 가지 방법으로 다시 세분화 할 수 있습니다.
이미 존재하는 byte[]
가있는 경우 처리를 단순화하기 위해 ByteBuffer
로 " 바꿀 " 수 있습니다.
byte[] reqBuffer = new byte[BUFFER_SIZE];
int readBytes = socketInputStream.read(reqBuffer);
final ByteBuffer reqBufferWrapper = ByteBuffer.wrap(reqBuffer);
이것은 저수준 네트워킹 상호 작용을 처리하는 코드에 대한 가능성 일 것입니다
이미 존재하는 byte[]
가 없다면 다음과 같이 버퍼에 특별히 할당 된 배열을 통해 ByteBuffer
를 만들 수 있습니다 :
final ByteBuffer respBuffer = ByteBuffer.allocate(RESPONSE_BUFFER_SIZE);
putResponseData(respBuffer);
socketOutputStream.write(respBuffer.array());
코드 경로가 극도로 중요한 성능을 발휘하고 직접 시스템 메모리 액세스 가 필요한 경우 ByteBuffer
는 #allocateDirect()
사용하여 직접 버퍼를 할당 할 수도 있습니다.
기본 사용법 - 버퍼에 데이터 쓰기
ByteBuffer
인스턴스를 지정하면 (자), 상대 와 절대 put
사용해 원시 형 데이터를 put
기입 할 수 있습니다. 눈에 띄는 차이점은 상대 메서드를 사용하여 데이터를 배치하면 데이터가 삽입되는 인덱스를 추적하는 반면 절대 메서드는 항상 데이터를 put
할 인덱스를 지정해야한다는 put
입니다.
두 방법 모두 "연결" 호출을 허용합니다. 충분한 크기의 버퍼가 주어지면 그에 따라 다음을 수행 할 수 있습니다.
buffer.putInt(0xCAFEBABE).putChar('c').putFloat(0.25).putLong(0xDEADBEEFCAFEBABE);
이는 다음과 같습니다.
buffer.putInt(0xCAFEBABE);
buffer.putChar('c');
buffer.putFloat(0.25);
buffer.putLong(0xDEADBEEFCAFEBABE);
byte
s로 동작하는 메소드의 이름은 특별히 지정되지 않습니다. 또한 그것은 모두 통과하는 것이 유효하다고주의 ByteBuffer
와 byte[]
에 put
. 그 외, 모든 원시 타입에는 특수한 put
메소드가 있습니다.
추가 정보 : 절대 put*
사용할 때 주어진 인덱스는 항상 byte
계산됩니다.
기본 사용법 - DirectByteBuffer 사용하기
DirectByteBuffer
는 byte[]
가없는 ByteBuffer
특수 구현입니다.
다음과 같이 ByteBuffer를 할당 할 수 있습니다.
ByteBuffer directBuffer = ByteBuffer.allocateDirect(16);
이 작업은 16 바이트의 메모리를 할당합니다. 직접 버퍼의 내용은 일반적인 가비지 수집 힙 외부에 있을 수 있습니다.
다음을 호출하여 ByteBuffer가 직접적인지 여부를 확인할 수 있습니다.
directBuffer.isDirect(); // true
DirectByteBuffer
의 주된 특징은 추가 버퍼링없이 JVM이 기본적으로 할당 된 메모리에서 작업을 수행하므로 어레이에서 수행되는 작업이 ByteBuffers에서 수행되는 작업보다 빠를 수 있다는 것입니다.
실시간 통신과 같이 실행 속도에 의존하는 과도한 IO 작업으로 DirectByteBuffer
를 사용하는 것이 DirectByteBuffer
.
array()
메서드를 사용하려고하면 UnsupportedOperationException
이 발생한다는 것을 알고 있어야합니다. 따라서 ByteBuffer에 접근하기 전에 ByteBuffer에 바이트 배열이 있는지 여부를 확인하는 것이 좋습니다.
byte[] arrayOfBytes;
if(buffer.hasArray()) {
arrayOfBytes = buffer.array();
}
다이렉트 byte 버퍼의 또 다른 용도는 JNI를 통한 interop입니다. 다이렉트 바이트 버퍼는 byte[]
가 아닌 실제 메모리 블록을 사용하므로 네이티브 코드의 포인터를 통해 해당 메모리에 직접 액세스 할 수 있습니다. 이렇게하면 Java와 네이티브 데이터 표현 사이의 마샬링에 약간의 문제와 오버 헤드를 줄일 수 있습니다.
JNI 인터페이스는 직접 바이트 버퍼를 처리하는 몇 가지 함수를 정의합니다. NIO 지원 .