ByteBuffer
Java 용 애플리케이션 예는 무엇입니까 ? 이것이 사용 된 예제 시나리오를 나열하십시오. 감사합니다!
ByteBuffer
Java 용 애플리케이션 예는 무엇입니까 ? 이것이 사용 된 예제 시나리오를 나열하십시오. 감사합니다!
답변:
이것은 그 사용법과 단점에 대한 좋은 설명입니다. 빠른 저수준 I / O가 필요할 때마다 기본적으로 사용합니다. TCP / IP 프로토콜을 구현하거나 데이터베이스 (DBMS)를 작성하는 경우이 클래스가 유용합니다.
ByteBuffer 클래스는 Java에서 채널 사용의 기초를 형성하기 때문에 중요합니다. ByteBuffer 클래스는 Java 7 문서에 명시된대로 바이트 버퍼에 대한 6 가지 범주의 작업을 정의합니다 .
Example code : Putting Bytes into a buffer.
// Create an empty ByteBuffer with a 10 byte capacity
ByteBuffer bbuf = ByteBuffer.allocate(10);
// Get the buffer's capacity
int capacity = bbuf.capacity(); // 10
// Use the absolute put(int, byte).
// This method does not affect the position.
bbuf.put(0, (byte)0xFF); // position=0
// Set the position
bbuf.position(5);
// Use the relative put(byte)
bbuf.put((byte)0xFF);
// Get the new position
int pos = bbuf.position(); // 6
// Get remaining byte count
int rem = bbuf.remaining(); // 4
// Set the limit
bbuf.limit(7); // remaining=1
// This convenience method sets the position to 0
bbuf.rewind(); // remaining=7
스트림 지향 API를 사용하는 Java IO는 버퍼를 사용하여 사용자 공간 내 데이터의 임시 저장소로 수행됩니다. DMA가 디스크에서 읽은 데이터는 먼저 커널 공간의 버퍼로 복사 된 다음 사용자 공간의 버퍼로 전송됩니다. 따라서 오버 헤드가 있습니다. 이를 피하면 성능이 크게 향상 될 수 있습니다.
커널 공간에서 버퍼에 직접 액세스 할 수있는 방법이 있다면 사용자 공간에서이 임시 버퍼를 건너 뛸 수 있습니다. Java NIO는 그렇게하는 방법을 제공합니다.
ByteBuffer
Java NIO가 제공하는 여러 버퍼 중 하나입니다. 데이터를 읽거나 쓰는 컨테이너 또는 저장 탱크입니다. 위의 동작은 allocateDirect()
API on Buffer를 사용하여 직접 버퍼를 할당하여 수행됩니다 .
다음 은 ByteBuffer 이점을 설명하는 훌륭한 기사입니다. 다음은이 기사의 핵심 사항입니다.
다음은 직접 ByteBuffer / MappedByteBuffer에 대한 이점입니다. 직접 버퍼는 힙 외부에서 작성됩니다.
gc주기의 영향을받지 않음 : 가비지 콜렉션주기 동안 직접 버퍼는 힙 외부에 상주하므로 이동되지 않습니다. TerraCota의 BigMemory 캐싱 기술은이 장점에 크게 의존하는 것 같습니다. 힙에 있으면 gc 일시 정지 시간이 느려집니다.
성능 향상 : 스트림 IO에서 읽기 호출은 시스템 호출을 수반하며, 이는 사용자가 커널 모드로 또는 그 반대로 컨텍스트 전환이 필요하며, 특히 파일에 지속적으로 액세스하는 경우 비용이 많이 듭니다. 그러나 메모리 매핑을 사용하면 메모리에서 데이터를 찾을 가능성이 높아짐에 따라 이러한 컨텍스트 전환이 줄어 듭니다 (MappedByteBuffer). 데이터가 메모리에서 사용 가능한 경우, OS를 호출하지 않고 (즉, 컨텍스트 전환이없는) 직접 액세스됩니다.
MappedByteBuffers는 파일이 크고 블록 그룹에 더 자주 액세스하는 경우에 특히 유용합니다.