programing

Java에서 ByteBuffer의 사용법은 무엇입니까?

new-time 2020. 5. 19. 21:24
반응형

Java에서 ByteBuffer의 사용법은 무엇입니까? [닫은]


 

ByteBuffer

Java 용 애플리케이션 예는 무엇입니까 ? 이것이 사용 된 예제 시나리오를 나열하십시오. 감사합니다!


이것은

그 사용법과 단점에 대한 좋은 설명입니다. 빠른 저수준 I / O가 필요할 때마다 기본적으로 사용합니다. TCP / IP 프로토콜을 구현하거나 데이터베이스 (DBMS)를 작성하는 경우이 클래스가 유용합니다.


ByteBuffer 클래스는 Java에서 채널 사용의 기초를 형성하기 때문에 중요합니다.

ByteBuffer

클래스는

Java 7 문서에 명시된 바와 같이

바이트 버퍼에 대한 6 가지 범주의 작업을 정의합니다 .

  • 단일 바이트를 읽고 쓰는 절대 및 상대

    get

    put

    메소드;
  • 연속적인 바이트 순서를이 버퍼로부터 배열에 전송하는 상대

    벌크 get

    메소드.
  • 바이트 배열 또는 다른 바이트 버퍼에서이 버퍼로 연속적인 바이트 시퀀스를 전송하는 상대

    벌크 넣기

    방법.
  • 다른 프리미티브 유형의 값을 읽고 바이트 단위의 특정 바이트 순서로 변환하는 절대 및 상대 get 및 put 메소드.
  • 바이트 버퍼를 다른 프리미티브 유형의 값을 포함하는 버퍼로 볼 수있는 뷰 버퍼 작성 방법;
  • 바이트 버퍼의

    압축

    ,

    복제

    슬라이스

    방법 .

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를 사용하여 직접 버퍼를 할당하여 수행됩니다 .

바이트 버퍼의 Java 문서에는 유용한 정보가 있습니다.


Android에서는 C ++와 Java (directAlloc 메소드 사용)간에 공유 버퍼를 작성하고이를 양쪽에서 조작 할 수 있습니다.


다음

은 ByteBuffer 이점을 설명하는 훌륭한 기사입니다. 다음은이 기사의 핵심 사항입니다.

  • 직접적이든 간접적이든 관계없이 ByteBuffer의 첫 번째 장점은 구조적 이진 데이터의 효율적인 랜덤 액세스 입니다 (예 : 답변 중 하나에 명시된 저수준 IO). Java 1.4 이전에는 이러한 데이터를 읽기 위해 임의의 액세스없이 DataInputStream을 사용할 수있었습니다.

다음은 직접 ByteBuffer / MappedByteBuffer에 대한 이점입니다. 직접 버퍼는 힙 외부에서 작성됩니다.

  1. gc주기의 영향을받지 않음

    : 가비지 콜렉션주기 동안 직접 버퍼는 힙 외부에 상주하므로 이동되지 않습니다. TerraCota의

    BigMemory

    캐싱 기술은이 이점에 크게 의존하는 것 같습니다. 힙에 있으면 gc 일시 정지 시간이 느려집니다.
  2. 성능 향상

    : 스트림 IO에서 읽기 호출은 시스템 호출을 수반하므로 사용자가 커널 모드로 또는 그 반대로 컨텍스트 전환이 필요합니다. 특히 파일에 지속적으로 액세스하는 경우 비용이 많이 듭니다. 그러나 메모리 매핑을 사용하면 메모리에서 데이터를 찾을 가능성이 높아짐에 따라이 컨텍스트 전환이 줄어 듭니다 (MappedByteBuffer). 메모리에서 데이터를 사용할 수있는 경우 OS를 호출하지 않고 (즉, 컨텍스트 전환 없음) 데이터에 직접 액세스합니다.

Note that MappedByteBuffers are very useful especially if the files are big and few groups of blocks are accessed more frequently.

  1. Page sharing: Memory mapped files can be shared between processes as they are allocated in process's virtual memory space and can be shared across processes.

참고URL : https://stackoverflow.com/questions/4841340/what-is-the-use-of-bytebuffer-in-java

반응형