JAVA/NIO2

[NIO.2]ByteBuffer

lahuman 2014. 2. 4. 17:29
728x90


버퍼는 근본적으로 데이터를 읽고 쓸 수 있는 배열이다.


Buffer 인터페이스는 ByteBuffer, ChrBuffer, IntBuffer, ShortBuffer, LongBuffer, FloatBuffer, DoubleBuffer 을 제공한다.

(보통 ByteBuffer 을 많이 사용한다.)

또한 ByteBuffer 을 생성시  allocateDirect 를 이용하면 다이렉트 버퍼(힙이 아닌 일반 메모리로 접근)로 만들수 있다.


ByteBuffer 속성

필수 요소

 - Limit : 버퍼에 쓸 때 얼마나 많은 데이터를 가질 수 있는지를 가르킨다.

 - Position : 얼마나 많은 데이터를 읽고 쓰는지 추적한다.

 - Capacity : 버퍼에 저장할 수 이있는 데이터의 최대 크기를 가르킨다.

0 ≤ position ≤ limit ≤ capacity

옵션 요소

 - Makr : reset() 메소드 호출시 버퍼의 초기화 될 위치를 가르킨다.

0 ≤ mark  position ≤ limit ≤ capacity


ByteBuffer 주요 메소드


생성 방법

 - 두 함수 모두 static 이고 int 값을 인자로 전달 받으며 버퍼의 크기를 지정한다.

 - wrap 메소드를 사용하여 논 다이렉트 버퍼를 생성 가능하다.

allocate : 일반 버퍼 생성

allocateDirecct : 다이렉트 버퍼 생성

        //일반 버퍼 생성
        ByteBuffer normalBuffer1 = ByteBuffer.allocate(1024);
        //값이 채워진 buffer 만듥.
        ByteBuffer normalBuffer2 = ByteBuffer.wrap("TEST".getBytes());
        //다이렉트 버퍼 생성
        ByteBuffer memoryBuffer = ByteBuffer.allocateDirect(1024);


읽거나 쓰는 방법 

 - put으로 데이터를 쓰게 되면 position이 이동하고 limit까지 도달 가능

get : 데이터를 읽을때 사용

put : 데이터를 쓸때 사용

        //읽기
        ByteBuffer buffer1 = ByteBuffer.wrap(new byte[]{0x01, 0x02, 0x03, 0x04, 0x05, 0x06});
        byte a = buffer1.get();
        byte b = buffer1.get();
        byte[] c = new byte[2];
        buffer1.get(c);
        byte d = buffer1.get();
        System.out.println(a+"/"+b+"/"+c[0]+","+c[1]+"/"+d);

        //쓰기
        ByteBuffer buffer2 = ByteBuffer.allocate(1024);
        buffer2.put((byte)0x01);
        buffer2.put(new byte[] {0x02, 0x03});
        buffer2.put((byte)0x04);

위치, 제한크기 변경 방법

- clear() : 위치값을 0으로 제한크기를 용량으로 변경해준다.

- flip() : 위치 값을 0으로 변경 해주고 제한 크기를 지금 위치값으로 변경 한다. mark 가 있을 경우 제거 한다.

- rewind() : position을 0으로 설정하고, mark를 제거한다.

- mark() : 현재 위치에 mark를 지정한다.

- reset() : mark로 이동한다.





참고자료 : http://download.java.net/jdk7/archive/b123/docs/api/java/nio/ByteBuffer.html?is-external=true

http://javacan.tistory.com/65

http://darksilber.tistory.com/entry/ByteBuffer-%EB%B0%94%EC%9D%B4%ED%8A%B8%EB%B2%84%ED%8D%BC

http://tjjava.blogspot.kr/2011/06/bytebuffer.html

728x90