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

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



답변

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


답변

ByteBuffer 클래스는 Java에서 채널 사용의 기초를 형성하기 때문에 중요합니다. ByteBuffer 클래스는 Java 7 문서에 명시된대로 바이트 버퍼에 대한 6 가지 범주의 작업을 정의합니다 .

  • 단일 바이트를 읽고 쓰는 절대 및 상대 getput 메소드;

  • 연속적인 바이트 순서를이 버퍼로부터 배열에 전송하는 상대 벌크 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는 그렇게하는 방법을 제공합니다.

ByteBufferJava 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를 호출하지 않고 (즉, 컨텍스트 전환이없는) 직접 액세스됩니다.

MappedByteBuffers는 파일이 크고 블록 그룹에 더 자주 액세스하는 경우에 특히 유용합니다.

  1. 페이지 공유 : 메모리 맵핑 파일은 프로세스의 가상 메모리 공간에 할당되어 프로세스간에 공유 될 수 있으며 프로세스간에 공유 될 수 있습니다.

답변