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


199

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


1
Apache Hadoop의 압축 (예 : zlib 코덱)은 jave.nio의 ByteBuffer를 사용합니다.
nikk

GPU로 데이터를 보내는 데 좋습니다.
Pixel

답변:


138

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


3
Java & Cassandra DB를 사용하여 개발 된 트래픽이 많은 웹 사이트에서 유용합니까?
Aklin

1
빠른 검색 후, Cassandra는 ByteBuffer를 사용하는 것으로 보입니다. mail-archive.com/commits@cassandra.apache.org/msg14967.html 원시 웹 사이트에 대해 궁금하다면 cassandra와 같은 도구를 사용하여 웹 사이트에서 간접적으로 사용할 것
kelloti

1
나쁜 링크는 아닙니다. 감사합니다. 내가 찾은 유용한 것을 추가하고 싶습니다 -worldmodscode.wordpress.com/2012/12/14/…
Peter Perháč

나쁜 링크 내가 두렵다 ...
RoyalBigMack

96

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

56
이 주석의 대부분은 java 7 docs 에서 복사됩니다 .
Janus Troelsen

6
명백하지 않은 부작용을 이용하지 않는 한, 절대 ​​넣기에 잘못된 방법을 사용하고 있다고 생각합니다. Javadoc은 절대 넣기에 색인 값이 필요하다는 것을 나타냅니다.
척 울버

6
그것은 단지 api 문서의 사본 일지라도 그것의 점수 bcs조차도 그것을 보지 못하기에 너무 게으른 것처럼 보입니다.
Chris

1
예제 중 하나에 실수가 있습니다. "절대 풋"은 인덱스를 나타내는 첫 번째 매개 변수를 누락합니다 (이 경우 0).
bvdb

21

스트림 지향 API를 사용하는 Java IO는 버퍼를 사용하여 사용자 공간 내 데이터의 임시 저장소로 수행됩니다. DMA가 디스크에서 읽은 데이터는 먼저 커널 공간의 버퍼로 복사 된 다음 사용자 공간의 버퍼로 전송됩니다. 따라서 오버 헤드가 있습니다. 이를 피하면 성능이 크게 향상 될 수 있습니다.

커널 공간에서 버퍼에 직접 액세스 할 수있는 방법이 있다면 사용자 공간에서이 임시 버퍼를 건너 뛸 수 있습니다. Java NIO는 그렇게하는 방법을 제공합니다.

ByteBufferJava NIO가 제공하는 여러 버퍼 중 하나입니다. 데이터를 읽거나 쓰는 컨테이너 또는 저장 탱크입니다. 위의 동작은 allocateDirect()API on Buffer를 사용하여 직접 버퍼를 할당하여 수행됩니다 .

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


14

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


13

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

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

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

  1. gc주기의 영향을받지 않음 : 가비지 콜렉션주기 동안 직접 버퍼는 힙 외부에 상주하므로 이동되지 않습니다. TerraCota의 BigMemory 캐싱 기술은이 장점에 크게 의존하는 것 같습니다. 힙에 있으면 gc 일시 정지 시간이 느려집니다.

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

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

  1. 페이지 공유 : 메모리 맵핑 파일은 프로세스의 가상 메모리 공간에 할당되어 프로세스간에 공유 될 수 있으며 프로세스간에 공유 될 수 있습니다.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.