programing

Java에서 ByteBuffer의 용도는 무엇입니까?

firstcheck 2022. 7. 31. 21:25
반응형

Java에서 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 되는 여러 중 입니다.데이터를 읽거나 쓸 수 있는 컨테이너 또는 보관 탱크입니다.은, 됩니다.allocateDirect()버퍼상의 API.

Java Documentation of Byte Buffer에는 유용한 정보가 있습니다.

다음은 ByteBuffer의 이점을 설명하는 훌륭한 기사입니다.이 기사의 요점은 다음과 같습니다.

  • ByteBuffer의 첫 번째 장점은 직접적이든 간접적이든 상관없이 구조화된 바이너리 데이터의 효율적인 랜덤 액세스입니다(예를 들어, 답변 중 하나에서 언급된 낮은 수준의 IO).Java 1.4 이전 버전에서는 이러한 데이터를 읽기 위해 DataInputStream을 사용할 수 있었지만 랜덤 액세스가 없었습니다.

다이렉트 바이트 버퍼/매핑 바이트 버퍼 전용의 메리트를 다음에 나타냅니다.직접 버퍼는 힙 외부에 생성됩니다.

  1. gc 사이클의 영향을 받지 않음:직접 버퍼는 힙 외부에 있으므로 가비지 수집 주기 동안 이동되지 않습니다.TerraCota의 BigMemory 캐싱 기술은 이러한 장점에 크게 의존하고 있는 것으로 보입니다.히프에 있는 경우 gc 포즈 시간이 느려집니다.

  2. 퍼포먼스 향상:스트림 IO에서 읽기 호출에는 시스템 호출이 수반됩니다.이 콜은 사용자 간에 커널 모드로 또는 그 반대로 컨텍스트 전환이 필요하며, 특히 파일에 지속적으로 액세스하는 경우 비용이 많이 듭니다.다만, 메모리 매핑에서는, 데이터가 메모리(매핑 바이트 버퍼)내에서 검출될 가능성이 높아지기 때문에, 이 콘텍스트 스위칭은 감소합니다.메모리내에서 데이터를 사용할 수 있는 경우는, OS 를 기동하지 않고 직접 액세스 할 수 있습니다.즉, 컨텍스트 스위칭은 필요 없습니다.

MappedByteBuffer는 특히 파일이 크고 액세스 빈도가 높은 블록 그룹이 적은 경우에 매우 유용합니다.

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

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

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

반응형