결론
시스템은 데이터 캐리어의 모든 데이터 (즉, 버퍼)으로의 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 때문에, 상기 방법이 수행되지 않도록 마크는 예외가 발생하는 경우.