수색…


소개

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로 동작하는 메소드의 이름은 특별히 지정되지 않습니다. 또한 그것은 모두 통과하는 것이 유효하다고주의 ByteBufferbyte[]put . 그 외, 모든 원시 타입에는 특수한 put 메소드가 있습니다.

추가 정보 : 절대 put* 사용할 때 주어진 인덱스는 항상 byte 계산됩니다.

기본 사용법 - DirectByteBuffer 사용하기

DirectByteBufferbyte[] 가없는 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 지원 .



Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow