java. nio. ByteBuffer 클래스 버퍼

http://blog.sina.com.cn/s/blog_4150f50c0100gfa3.html
Buffer 류
primitive type 데 이 터 를 선형 으로 저장 할 수 있 는 용기 인 터 페 이 스 를 정의 합 니 다.버 퍼 는 주로 유형 (byte, char...) 과 무관 한 기능 을 포함한다.주의해 야 할 것 은 버 퍼 와 그 하위 클래스 는 모두 라인 이 안전 하지 않다 는 것 이다.
버 프 마다 다음 과 같은 속성 이 있 습 니 다:
capacity 라 는 Buffer 는 최대 몇 개의 데 이 터 를 넣 을 수 있 습 니까?capacity 는 보통 buffer 가 생 성 될 때 지정 합 니 다.
limit 가 버 퍼 에서 진행 하 는 읽 기와 쓰기 동작 은 이 아래 표 시 를 넘 을 수 없습니다.buffer 에 데 이 터 를 쓸 때 limit 은 보통 capacity 와 같 습 니 다. 데 이 터 를 읽 을 때 limit 은 buffer 의 유효한 데이터 길 이 를 대표 합 니 다.
position 읽 기 / 쓰기 작업 의 현재 아래 표 시 됩 니 다.buffer 의 상대 적 인 위 치 를 사용 하여 읽 기 / 쓰기 작업 을 할 때 읽 기 / 쓰 기 는 이 아래 표 시 를 통 해 진행 되 며, 작업 이 완료 되면 buffer 는 아래 표 시 된 값 을 업데이트 합 니 다.
mark 임시 저장 위치 아래 표시 합 니 다.mark () 를 호출 하면 mark 를 현재 position 의 값 으로 설정 하고 reset () 를 호출 하면 position 속성 을 mark 의 값 으로 설정 합 니 다.mark 의 값 은 항상 position 의 값 보다 작 습 니 다. position 의 값 을 mark 보다 작 게 설정 하면 현재 mark 값 은 버 려 집 니 다.
이러한 속성 은 항상 다음 과 같은 조건 을 만족 시 킵 니 다: 0 < = mark < = position < = limit < = capacity
limit 와 position 의 값 은 limit () 와 position () 함 수 를 통 해 설정 하 는 것 을 제외 하고 아래 함수 들 을 통 해 변경 할 수 있 습 니 다.
Buffer clear () 는 position 를 0 으로 설정 하고 limit 를 capacity 로 설정 합 니 다. 보통 데 이 터 를 Buffer 에 쓰기 전에 호출 합 니 다.
Buffer flip () 는 limit 를 현재 position 로 설정 하고 position 를 0 으로 설정 합 니 다. 보통 Buffer 에서 데 이 터 를 읽 기 전에 호출 합 니 다.
Buffer rewind () 는 position 를 0 으로 설정 하고 limit 는 변 하지 않 으 며, 일반적으로 데 이 터 를 Buffer 에 다시 쓰기 전에 호출 합 니 다.
Buffer 대상 은 읽 기 전용 일 수 있 습 니 다. 이 때 이 대상 에 대한 쓰기 동작 은 ReadOnly Buffer Exception 을 촉발 합 니 다.isReadOnly () 방법 은 Buffer 가 읽 기만 하 는 지 여 부 를 판단 하 는 데 사용 할 수 있 습 니 다.
ByteBuffer 클래스
Buffer 의 하위 클래스 에서 ByteBuffer 는 비교적 특별한 위치 에 있 는 클래스 입 니 다. 자바. io. channels 에서 정 의 된 각종 channel 의 IO 작업 은 기본적으로 ByteBuffer 를 중심 으로 전개 되 기 때 문 입 니 다.
ByteBuffer 는 생 성 작업 을 위해 4 개의 static 방법 을 정 의 했 습 니 다.
ByteBuffer allocate (int capacity) / 지정 한 capacity 의 ByteBuffer 를 만 듭 니 다.ByteBuffer allocateDirect (int capacity) / / direct 의 ByteBuffer 를 만 듭 니 다. 이러한 ByteBuffer 는 IO 작업 에 참여 할 때 성능 이 더 좋 습 니 다. ByteBuffer wrap (byte [] array) ByteBuffer wrap (byte [] array, int offset, int length) / / byte 배열 이나 byte 배열 의 일부분 을 ByteBuffer 로 포장 합 니 다.
ByteBuffer 는 일련의 get 과 put 작업 을 정의 하여 그 중에서 byte 데 이 터 를 읽 고 씁 니 다. 예 를 들 어 다음 과 같은 몇 가지: byte get () ByteBuffer get (byte [] dst) byte get (int index) ByteBuffer put (byte b) ByteBuffer put (byte [] src) ByteBuffer put (int index, byte b) 이 작업 들 은 절대적 인 포 지 셔 닝 과 상대 적 으로 두 가지 로 나 눌 수 있 습 니 다.상대 적 으로 위 치 를 정 하 는 읽 기와 쓰기 동작 은 position 에 의 해 Buffer 의 위 치 를 정 하고 작업 이 완료 되면 position 의 값 을 업데이트 합 니 다.다른 유형의 buffer 에서 도 같은 함수 로 데 이 터 를 읽 고 쓰 는 것 을 정 의 했 습 니 다. 유일 하 게 다른 것 은 일부 매개 변수 와 반환 값 의 유형 입 니 다.
byte 형식의 데 이 터 를 읽 고 쓰 는 함수 외 에 ByteBuffer 의 특별한 점 은 다른 primitive 데 이 터 를 읽 고 쓰 는 방법 도 정의 한 것 입 니 다. 예 를 들 어:
int getInt()       //ByteBuffer 에서 int 값 을 읽 습 니 다.ByteBuffer putInt(int value)     // ByteBuffer 에 int 값 을 기록 합 니 다.다른 유형의 데 이 터 를 읽 고 쓰 는 것 은 바이트 순서 문제 와 관련 되 어 있 습 니 다. ByteBuffer 는 바이트 순서 (큰 바이트 순서 나 작은 바이트 순서) 에 따라 다른 유형의 데 이 터 를 쓰 거나 읽 습 니 다 (int, long...).바이트 순 서 는 order 방법 으로 얻 고 설정 할 수 있 습 니 다: ByteOrder order () / / ByteBuffer 의 바이트 순 서 를 되 돌려 줍 니 다.ByteBuffer order(ByteOrder bo)   // ByteBuffer 의 바이트 순 서 를 설정 합 니 다.
ByteBuffer 의 또 다른 특별한 점 은 그것 을 바탕 으로 다른 유형의 buffer 를 얻 을 수 있다 는 것 이다.예 를 들 어 CharBuffer asCharBuffer () 는 현재 ByteBuffer 에 CharBuffer 보 기 를 만 듭 니 다.이 보기 buffer 에서 의 읽 기와 쓰기 동작 은 ByteBuffer 의 바이트 순서에 따라 ByteBuffer 의 데이터 에 작용 합 니 다.
이러한 방법 으로 만들어 진 buffer 는 ByteBuffer 의 position 위치 부터 limit 위치 까지 이 데이터 의 보기 로 볼 수 있 습 니 다.보기 buffer 의 readOnly 속성 과 direct 속성 은 ByteBuffer 와 일치 하 며, 이러한 방법 을 통 해서 만 다른 데이터 형식의 direct buffer 를 얻 을 수 있 습 니 다.
ByteOrder 는 ByteBuffer 바이트 순 서 를 나타 내 는 클래스 로 자바 의 enum 형식 으로 볼 수 있 습 니 다.다음 static 방법 과 속성 을 정의 합 니 다: ByteOrder BIGENDIAN       큰 바이트 순 서 를 대표 하 는 ByteOrder.ByteOrder LITTLE_ENDIAN       작은 바이트 순 서 를 대표 하 는 ByteOrder.ByteOrder nativeOrder()       현재 하드웨어 플랫폼 의 바이트 순 서 를 되 돌려 줍 니 다.MappedByteBuffer ByteBuffer 의 하위 클래스 는 파일 내용 이 메모리 에 비 치 는 것 입 니 다.이 종류의 인 스 턴 스 는 FileChannel 의 map () 방법 으로 만들어 야 합 니 다.
 
 
다음은 ByteBuffer 를 사용 하 는 예 를 살 펴 보 겠 습 니 다. 이 예 는 표준 입력 에서 끊임없이 문 자 를 읽 고 한 줄 을 다 읽 은 후에 수 집 된 문 자 를 표준 출력 으로 기록 합 니 다.
   
public static void main(String [] args)
       throws IOException
    {
       //     capacity 256 ByteBuffer
       ByteBuffer buf = ByteBuffer.allocate(256);
       while (true) {
           //             
           int c = System.in.read();
           //          ,    
           if (c == -1)
              break;
           //         ByteBuffer 
           buf.put((byte) c);
           //       ,       
           if (c == '
') { // flip() limit position ,position 0, // ByteBuffer buf.flip(); // byte byte [] content = new byte[buf.limit()]; // ByteBuffer byte buf.get(content); // byte System.out.print(new String(content)); // clear() position 0,limit capacity , // ByteBuffer buf.clear(); } } }

좋은 웹페이지 즐겨찾기