Java NIO Buffer 프로 세 스 상세 설명

7241 단어 자바niobuffer
머리말
NIO 채널 과 대화 할 때 자바 NIO Buffer 를 사용 합 니 다.알다 시 피 데 이 터 는 채널 에서 버퍼 를 읽 고 버퍼 에서 채널 을 기록 합 니 다.
버퍼 는 본질 적 으로 데 이 터 를 쓸 수 있 는 메모리 블록 이 고 다시 읽 을 수 있 습 니 다.이 메모리 블록 은 NIO Buffer 대상 에 포함 되 어 있 으 며,이 대상 은 메모리 블록 을 더욱 쉽게 사용 할 수 있 는 방법 을 제공 합 니 다.
기본 버퍼 사용법
버퍼 를 사용 하여 데 이 터 를 읽 고 기록 하 는 것 은 보통 이 네 가지 작은 절 차 를 따른다.
1.버퍼 에 데 이 터 를 기록 합 니 다.
2.buffer.flip()호출
3.버퍼 에서 데이터 읽 기
4.buffer.clear()또는 buffer.compact()호출
Buffer 에 데 이 터 를 기록 할 때 Buffer 는 데 이 터 를 얼마나 썼 는 지 추적 합 니 다.데 이 터 를 읽 을 필요 가 있 으 면,버퍼 를 쓰기 모드 에서 읽 기 모드 로 변환 하 는 flip()방법 을 사용 해 야 합 니 다.읽 기 모드 에서 Buffer 는 이전에 쓴 데 이 터 를 모두 읽 을 수 있 도록 합 니 다.
모든 데 이 터 를 읽 었 다 면 버 퍼 를 지우 고 다음 에 데 이 터 를 쓸 준 비 를 해 야 합 니 다.다음 과 같은 두 가지 방법 으로 완성 할 수 있다.clear()와 compact().clear()방법 은 전체 Buffer 를 제거 합 니 다.compact()방법 은 읽 은 Buffer 만 제거 합 니 다.읽 지 않 은 데 이 터 는 Buffer 의 시작 위치 로 이동 합 니 다.다시 쓴 데 이 터 는 읽 지 않 은 데이터 뒤에 추 가 됩 니 다.
이것 은 간단 한 Buffer 가 사용 하 는 예 입 니 다.write,flip,read 와 clear 작업 을 사용 합 니 다.

RandomAccessFile aFile = new RandomAccessFile("data/nio-data.txt", "rw");
FileChannel inChannel = aFile.getChannel();
//create buffer with capacity of 48 bytes
ByteBuffer buf = ByteBuffer.allocate(48);int bytesRead = inChannel.read(buf); //read into buffer.
while (bytesRead != -1) { buf.flip(); //make buffer ready for read
while(buf.hasRemaining()){
System.out.print((char) buf.get()); // read 1 byte at a time
} buf.clear(); //make buffer ready for writing
bytesRead = inChannel.read(buf);
}
aFile.close();
Buffer 의 세 가지 속성:용량,위치 와 한정 문자
Buffer 는 본질 적 으로 데 이 터 를 쓸 수 있 는 메모리 영역 입 니 다.물론 기록 한 후에 데 이 터 를 읽 을 수 있 습 니 다.이 메모리 영역 은 NIO Buffer 대상 으로 봉 인 됩 니 다.이 메모리 영역 에 대한 조작 을 편리 하 게 하기 위해 일련의 방법 을 제공 합 니 다.
Buffer 가 어떻게 일 하 는 지 배우 기 위해 서 는 Buffer 의 세 가지 속성 을 숙지 해 야 합 니 다.그들 은:
용량
position(커서 위치)limit(말미 한정 부)그 중에서 position 와 limit 의 의 미 는 현재 Buffer 가 읽 기 모드 인지 쓰기 모드 인지 에 의존 합 니 다.capacity 의 의 미 는 읽 기와 쓰기 패턴 이 모두 같다.
다음은 상기 세 가지 속성 에 대한 읽 기 모드 와 쓰기 모드 의 예제 입 니 다.그 다음 에 상세 한 설명 이 있 을 것 입 니 다.

Buffer capacity, position and limit in write and read mode.
용량(용량)
메모리 블록 으로서 버 퍼 는 고정된 크기 를 가지 고 있 는데 우 리 는'capacity(용량)'라 고 부른다.최대 Buffer 에 capacity 크기 의 바이트,긴 정수,문자 등 만 쓸 수 있 습 니 다.Buffer 가 가득 차 면 데 이 터 를 계속 쓰기 전에 비 워 야 합 니 다(데 이 터 를 읽 거나 지 워 야 합 니 다).
포지션(커서 위치)
Buffer 에 데 이 터 를 쓰기 시 작 했 을 때 데 이 터 를 쓸 위 치 를 알 아야 합 니 다.position 의 초기 값 은 0 입 니 다.하나의 바이트 나 긴 정수 등 유사 한 데이터 형식 이 Buffer 에 기록 되면 position 는 다음 데 이 터 를 쓸 위 치 를 가리 키 게 됩 니 다(데이터 형식 크기 에 따라 계산 합 니 다).position 의 최대 치 는 capacity-1 입 니 다.
Buffer 에서 데 이 터 를 읽 어야 할 때 어떤 위치 에서 데 이 터 를 읽 어야 할 지 알 아야 합 니 다.flip 방법 을 사용 하여 Buffer 를 쓰기 모드 에서 읽 기 모드 로 바 꿀 때 position 는 0 으로 다시 설정 되 었 습 니 다.그리고 position 가 가리 키 는 위치 에서 데 이 터 를 읽 습 니 다.다음 position 은 다음 읽 을 위 치 를 가리 키 고 있 습 니 다.
제한(제한)
쓰기 모드 에서 Buffer 에 대한 제한 은 얼마나 많은 데 이 터 를 Buffer 에 쓸 수 있 는 지 입 니 다.쓰기 모드 에서 Buffer 와 같은 용량(capacity)을 제한 합 니 다.
Buffer 를 읽 기 모드 로 전환 할 때 최대 얼마나 많은 데 이 터 를 읽 을 수 있 는 지 제한 합 니 다.따라서 버퍼 를 읽 기 모드 로 전환 할 때 쓰기 모드 의 position 값 으로 제한 합 니 다.다시 말 하면 이전에 기 록 된 모든 데 이 터 를 읽 을 수 있 습 니 다.
버퍼 타 입
Java NIO 는 다음 과 같은 몇 가지 Buffer 유형 을 제시 했다.
  • ByteBuffer
  • MappedByteBuffer
  • CharBuffer
  • DoubleBuffer
  • FloatBuffer
  • IntBuffer
  • LongBuffer
  • ShortBuffer
  • 보시 다시 피 이 버 퍼 형식 들 은 서로 다른 데이터 형식 을 대표 합 니 다.다시 말 하면,그들 은 사용 할 때 char,short,int,long,float 또는 double 형식 으로 buffer 의 바이트 대신 사용 할 수 있 게 한다.
    그 중에서 Mapped Byte Buffer 는 좀 특이 해서 자신의 부분 에서 논술 할 것 이다.
    Buffer 하나 할당
    Buffer 대상 을 가 져 오 려 면 먼저 할당 해 야 합 니 다.모든 Buffer 클래스 는 할당 할 allocate()함수 가 있 습 니 다.아래 의 예 는 하 나 를 분배 하 는 것 을 보 여 주 었 다.
    ByteBuffer 의 용량 은 48 바이트 이다.ByteBuffer buf = ByteBuffer.allocate(48);아래 의 예 는 1024 글자 의 공간 을 가 진 CharBuffer 를 할당 하 는 것 입 니 다.CharBuffer buf = CharBuffer.allocate(1024);Buffer 에 데 이 터 를 기록 합 니 다.
    Buffer 에 데 이 터 를 기록 할 수 있 는 두 가지 방법 이 있 습 니 다.
    1.채널 에서 데 이 터 를 Buffer 에 기록 합 니 다.
    2.buffer 의 put()함 수 를 호출 하여 데 이 터 를 Buffer 에 기록 합 니 다.
    다음은 채널 이 Buffer 에 데 이 터 를 어떻게 기록 하 는 지 보 여 주 는 예 입 니 다.int bytesRead = inChannel.read(buf); //read into buffer.아래 의 예 는 put()함 수 를 통 해 데 이 터 를 Buffer 에 기록 하 는 것 입 니 다.buf.put(127);put()함수 에는 다른 버 전이 많이 있 습 니 다.사용 하지 않 는 방법 으로 데 이 터 를 Buffer 에 기록 할 수 있 습 니 다.예 를 들 어 특정한 위치 에 쓰 거나 바이트 배열 을 buffer 에 기록 합 니 다.자바 독 을 보면 buffer 가 실현 하 는 더 많은 세부 사항 을 알 수 있 습 니 다.
    flip()
    쓰기 모드 에서 읽 기 모드 로 Buffer f 를 flip()방법 으로 전환 합 니 다.flip()를 호출 하여 position 를 0 으로 설정 하고 limit 를 방금 위치 로 설정 합 니 다.
    다시 말 하면 position 는 현재 읽 기 위 치 를 표시 하고 limit 는 버퍼 에 쓸 바이트,문자 수 등―읽 을 수 있 는 바이트 수,문자 수 등의 제한 을 표시 합 니 다.
    버퍼 에서 데이터 읽 기
    버 퍼 에서 데 이 터 를 읽 을 수 있 는 두 가지 방법 이 있다.
    1.버퍼 에서 데 이 터 를 채널 로 읽 습 니 다.
    2.버퍼 자체 테이프 방법 중의 get()방법 으로 버퍼 에서 데 이 터 를 읽 습 니 다.
    버퍼 에서 채널 로 데 이 터 를 읽 는 방법:
    
    //read from buffer into channel.
    int bytesWritten = inChannel.write(buf);
    다음은 get()방법 으로 Buffer 에서 데 이 터 를 읽 는 예 입 니 다.byte aByte = buf.get();get()방법 은 다른 버 전도 많 습 니 다.다양한 방식 으로 Buffer 에서 데 이 터 를 읽 을 수 있 습 니 다.예 를 들 어 특정 위치 에서 읽 거나 버퍼 에서 바이트 배열 을 읽 습 니 다.구체 적 인 버퍼 구현 에 대한 자세 한 정 보 는 자바 독 을 참조 하 시기 바 랍 니 다.
    rewind()
    Buffer.rewind()는 position 를 0 으로 설정 하기 때문에 버퍼 의 모든 데 이 터 를 다시 읽 을 수 있 습 니 다.이 limit 는 변 하지 않 기 때문에 Buffer 에서 읽 을 수 있 는 요소(바이트,문자 등)가 얼마나 있 는 지 표시 합 니 다.
    clear() and compact()
    Buffer 에서 데 이 터 를 읽 은 후 Buffer 가 다시 쓰기 위해 준 비 를 해 야 합 니 다.clear()를 호출 하거나 compact()를 호출 하여 이 점 을 할 수 있 습 니 다.
    clear()를 호출 하면 position 는 0 으로 설정 되 고 limit 는 capacity 로 설 정 됩 니 다.버 퍼 가 제거 됐다 는 얘 기다.Buffer 의 데이터 가 삭제 되 지 않 았 습 니 다.태그 만 이 데 이 터 를 Buffer 에 쓸 수 있 는 위 치 를 알려 줍 니 다.
    clear()를 호출 할 때 버퍼 에 읽 지 않 은 데이터 가 있 으 면 데 이 터 는'잊 혀 짐'입 니 다.이 는 어떤 데이터 가 읽 혔 는 지,어떤 데이터 가 읽 히 지 않 았 는 지 설명 하 는 태그 가 없습니다.
    Buffer 에 읽 지 않 은 데이터 가 있 고 나중에 읽 기 를 원 하지만,clear()대신 compact()를 사용 해 야 합 니 다.
    compact()는 읽 지 않 은 모든 데 이 터 를 Buffer 의 시작 부분 으로 복사 합 니 다.그리고 position 를 마지막 읽 지 않 은 요소 의 위치 로 설정 합 니 다.clear()와 마찬가지 로 limit 속성 은 capacity 로 설정 되 어 있 습 니 다.현재 Buffer 는 기록 할 준비 가 되 어 있 지만 읽 지 않 은 데 이 터 를 덮어 쓰 지 않 습 니 다.
    mark() and reset()
    Buffer.mark()방법 을 사용 하여 Buffer 에 주어진 위 치 를 표시 할 수 있 습 니 다.그 후에 Buffer.reset()방법 으로 표 시 된 이 위 치 를 리 셋 할 수 있 습 니 다.다음은 예 입 니 다.
    
    buffer.mark();
    //call buffer.get() a couple of times, e.g. during parsing.
    buffer.reset(); //set position back to mark.
    equals() and compareTo()
    equals()와 compare To()방법 으로 두 개의 버퍼 를 비교 할 수 있 습 니 다.
    equals()
    두 버퍼 가 같 습 니 다.만약:
    1.그들 은 같은 유형(byte,char,int 등)이다.
    2.버퍼 에 같은 양의 바이트,문자 등 이 남아 있 습 니 다.
    3.남 겨 진 모든 바이트,문자 가 같 습 니 다.
    보시 다시 피 equals 는 모든 요소 가 아 닌 Buffer 의 일부분 만 비교 합 니 다.사실 버 퍼 에 남 겨 진 요소 만 비교 합 니 다.
    compareTo()
    compare To()방법 으로 두 버퍼 에 남 겨 진 요소(바이트,문자 등)를 비교 합 니 다.예 를 들 어 정렬 루틴 에 사용 합 니 다.다음 상황 에서 하나의 버퍼 는'작은'다른 버퍼 로 간 주 됩 니 다.만약:
    다른 버퍼 에 대응 하 는 요소 와 같은 첫 번 째 요 소 는 다른 버퍼 보다 작은 요소 입 니 다.
    모든 요 소 는 같 지만 첫 번 째 버퍼 는 두 번 째 버퍼 전에 요 소 를 소 진 했 습 니 다.
    이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

    좋은 웹페이지 즐겨찾기