연구 및 소스 코드를 사용하여 자바 NIO의 ByteBuffer

결론

  시스템은 데이터 캐리어의 모든 데이터 (즉, 버퍼)으로의 ByteBuffer를 기반으로 채널과 상호 자바 NIO의 ByteBuffer베이스 클래스이다. 하부의 ByteBuffer 바이트 배열이고, 버퍼에 구현되는, 데이터 기입 동작 (마크 한계 위치 용량) 등에 다중화 네 부재 중요한 변수를 버퍼링한다. 두 가지 유형, 즉 외부 힙 메모리와 힙 메모리, 강력한 성능을 가지고 외부 메모리 힙의 ByteBuffer 버퍼 메모리 (배열)를 적용,하지만 당신은 JVM 관리에 힙 메모리를 확보 할 수 있고, 신중하게 처리해야하는 방법이 있습니다. 또한 중요 ByteBuffer를 스레드로부터 안전하지 않습니다 주목해야한다.

둘째, API 조사

  새로운 것을 항상 먼저 다음 사항을 고려, 그 본질로 돌아가 알아보기 :

  당신은 버퍼로 배열을 사용하는 경우, 버퍼는해야 할 일을 다시 사용하려는?

  여기에서 우리는 (아래 코드)를 설명한다 파일을 차단하는 IO 쓰기

  우리는 버퍼가 읽고 쓸 실제 바이트 수를 기록하고 바이트 수 실제로 byteOutputStream을 읽고, 쓰고 계속되면 파일을 읽어 버퍼로 새로운 배열을 만들었습니다.

  하기 위해 볼 수있는 바와 같이 첫 번째 버퍼와 같은 배열을 사용하여, 우리는 적어도 다음의 데이터가 필요

    1 버퍼 크기 (buffer.length)

    2. 가능한 버퍼의 바이트 수 (즉 readLength, 전체 버퍼를 채우는 데이터를 매번 판독하는 것은 불가능하다 )

    데이터가 판독 될 수 있기 때문에,의 InputStream는 세그먼트 버퍼를 지정하고, 따라서 버퍼에서 사용할 수있는 바이트의 수는 실제로는 어레이 인덱스 값 (디폴트 0)를 더한 바이트 판독 조성물의 실제 개수의 길이 가.

1      공용  정적  공극 () 메인 발생 IOException가 {
 2          바이트 [완충액 = 새로운  바이트 [1024 ];
3          ByteOutputStream byteOutputStream = 새로운 ByteOutputStream ();
4  
5          파일 파일 = 새로운 파일 ( "D : / tmp를 / 테스트" );
6          또는 FileInputStream = inputStream을 새로운 또는 FileInputStream (파일);
7          INT readLength = 0 ;
8          동안 ((readLength = inputStream.read (완충액))! = 0 ) {
 9              //뭔가를 할 
10              byteOutputStream.write을 (버퍼, 0 , readLength);
11          }
 12          inputStream.close ();
(13)          에서 System.out.println ( 새로운 문자열 (byteOutputStream.getBytes ()));
14      }

  네 개의 변수를 따르고 따라서 ByteBuffer를이 버퍼 영역으로서 재이용 할 수 있고, 또한 코어 부재 기본 버퍼와 같은 배열을 사용하여

    // 불변 : 마크 <= 위치 <= 제한 <= 용량 
    전용  INT의 마크 = -1 ;
    개인  INT의 위치 = 0 ;
    개인  INT의 한계;
    개인  INT의 능력;

  마크 마크

  위치 측정, 즉 여기서 현재 포인터 배열의 위치에, 다음의 판독 위치는 어디에 포인터 \ 기록 배열 요소

  제한 버퍼 제한은, 제 판독 \ 안된다 데이터 위치 (readLength에 대응)이 버퍼 (기본적으로 동일 용량)에 기입된다

  버퍼 용량 (대응 buffer.length)의 실제 크기

  그래서 주로 주위에 네 주위에 멤버 변수의 ByteBuffer API를 수행하는.

  

  도시 나머지 1 (있어서 나머지 요소의 크기를 얻는 데 사용)

    공공  최종  INT ) (나머지 {
         반환 제한 - 위치; 
    }

   

      ( "NIO 및 소켓 프로그래밍 가이드"에서 사진)

    예를 들어 도시되어 현재 데이터를 판독하기 위해도 용량 = 8 = 6 한계 위치 = 2에 도시 된 바와 같이 현재 판독 가능한 네 개의 요소가있다.

 

  2.ByteBuffer 다중화 구현

  판독 및 기록 파일을 차단 참고 예는, 리셋의 ByteBuffer과 관련된 변수를 결정하는 다른 변수는 다른 효과를 재설정 다시 결합 될 수있다.

  데이터가 반드시 작성 다시 읽을 때 예를 들어,의 ByteBuffer에 데이터를 기입 한 후, 데이터의 실제 길이를 알고 있어야합니다 ( 제한 및 쓰기 데이터에 따라 변화하지 않는, 한계는 한계 버퍼를 나타냅니다 ) 및 배열 포인터는 0 위치로 이동한다.

  으로 filp 접근 방식은 다음을 달성하는이 작업을 수행하는 실행 가능한 것입니다 :

공용  최종 버퍼 플립 () { 
        한계 = 위치; 
        위치 = 0 ; 
        마크 = -1 ;
        반환  ; 
}

  버퍼의 상태를 복원하기 위해, 직접 분명 호출 할 수 있지만, 방법은 버퍼에 데이터를 삭제하지 않습니다

공공  최종 버퍼 클리어 () { 
        위치 = 0 ; 
        제한 = 용량; 
        마크 = -1 ;
        반환  ; 
 }

  데이터를 판독하는 프로세스 (이 경우에서받은 위치가 변경된)는 단순히 리셋 수받은 위치로부터 데이터를 다시 판독하고 싶은 경우, 되감기 방법 -1로 리셋하는 마크가 사용될 수있다.

공용  최종 버퍼 되감기 () { 
        위치 = 0 ; 
        마크 = -1 ;
        반환  ; 
    }

  3 명심 해 약

  버퍼 랜덤 액세스 (가능해, RandomAccess)를 지원하고, 물품 또는 포인터 배열 만 전진 할 때 데이터를 판독하지만, 일부 상황에서, 우리는 데이터 세그먼트에 필요한 수없는 설계에서의 ByteBuffer 내용은이 시간에만 마커 위치로 포인터를 이동하는 데 필요한 시간의 지정된 위치에 표시 작업을 수행 할 필요가에서 반복적으로 읽습니다.

  표시 방법은 다음과 같습니다, 그러나 임시 위치 및 포인터의 위치를 ​​변경하지 않습니다.

    공용  최종 버퍼 마크 () { 
    마크 = 위치;
    반환  ; 
    }

  당신이 위치로 반환 할 경우 리셋 방법을 수행하는 것이 필요하다 그래서.

공용  최종 버퍼 초기화 () {
     INT의 m = 마크;
    경우 (m <0 )
         던져  새로운 (InvalidMarkException)를; 
    위치 = m;
    반환  ; 
}

  마크 기본값 -1 때문에, 상기 방법이 수행되지 않도록 마크는 예외가 발생하는 경우.

 

 

  

  

  

  

추천

출처www.cnblogs.com/smallke/p/11218647.html