ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • NIO - Buffer
    프로그래밍 언어/JAVA 2020. 4. 3. 11:53

    NIO - Buffer

     

     

    Direct Buffer와 NonDirect Buffer

     

    Direct Buffer

    운영체제의 메모리

    버퍼 생성이 느리다

    버퍼 크기 크다

    입출력 성능 높다

     

    NonDirect Buffer

    JVM 힙 메모리

    퍼버 생성이 빠르다

    버퍼 크기 작다

    입출력 성능 낮다

     

    ByteBuffer directBuffer = ByteBuffer.allocateDirect(100);
    ByteBuffer nonDirectBuffer = ByteBuffer.allocate(100);

     

    버퍼 생성

    NonDirectBuffer를 생성하기 위해서는 각 Buffer 클래스의 allocate()와 wrap() 메소드 호출

    DirectBuffer는 ByteBuffer의 allocateDirect() 메소드를 호출

     

    allocate() 메소드

    JVM 힙 메모리에 넌다이렉트 버퍼 생성

    wrap() 메소드

    이미 생성되어 있는 자바 배열을 wrapping하여 Buffer 객체를 생성

    자바 배열은 JVM 힙 메모리에 생성되므로 wrap()은 NonDirectBuffer 생성

    배열의 일부 길이만으로도 Buffer 객체 생성 가능

     

    byte[] byteArray = new byte[100];
    ByteBuffer byteBuffer = ByteBuffer.wrap(byteArray, 0, 50);
    
    CharBuffer charBuffer = CharBuffer.wrap("NIO I/O");

     

    byte 해석 순서(ByteOrder)

    Big endian : 앞쪽 바이트부터 먼저 처리하는 것

    Little endian : 뒤쪽 바이틉터 먼저 처리하는 것

     

    JVM은 무조건 Big endian으로 동작

     

    버퍼의 위치 속성

     

    flip() 호출, limit --> 5번 위치, position --> 0

     

    3 byte 읽기, position --> 3

     

    mark() 호출, 현재 3번 자리에 mark 자리 잡음

    2 byte 더 읽기

    reset() 호출, position --> mark 위치

     

    rewind() 메소드를 호출, position --> 0, mark --> 없어짐

     

    clear()는 세가지 속성 초기화, limit --> capacity, position --> 0, mark--> 없어짐

    데이터는 삭제 되지 않음

     

     

     

    compact()

    읽지 않은 데이터 뒤에 새로운 데이터를 저장하기 위해

     

     

    버퍼 메소드

     

    공통 메소드

    Buffer 추상 클래스

    flip(), rewind(), clear(), mark(), reset() 도 모두 Buffer 추상 클래스

     

    데이터를 읽고 저장하는 메소드

    put() - 버퍼에 데이터를 저장

    get() - 데이터를 읽음

     

     

    버퍼의 변환

    채널이 읽고 쓰는 버퍼는 모두 byteBuffer

    byteBuffer를 다른 종류의 버퍼로 변화해야 사용 가능

     

    ByteBuffer <-> String

    문자열을 파일이나 네트워크 전송을 위해서 특정 문자셋으로 인코딩해서 byteBuffer로 변환

     

    java.nio.charset.Charset 객체 필요

    Charset charset = Charset.forName("UTF-8");
    Charset charset = Charset.defaultCharset();

     

    인코딩

    String data = ".....";

    ByteBuffer buffer = charset.encode(data);

     

    디코딩

    ByteBuffer buffer = ...;

    String data = charset.decode(byteBuffer).toString();



    ByteBuffer <-> IntBuffer

    int 타입은 4 byte 크기를 가지므로 int[] 배열 크기 또는 IntBuffer의 capacity보다 4배 큰 capacity를 가진 ByteBuffer를 생성해야 하고, ByteBuffer의 putInt() 메소드로 정수값을 하나씩 저장

     

     



    출처: https://palpit.tistory.com/641 [palpit Vlog]

     

     

     

     

     

    '프로그래밍 언어 > JAVA' 카테고리의 다른 글

    JVM3  (0) 2020.05.02
    JVM2  (0) 2020.04.26
    JVM  (0) 2020.04.26
    추상 클래스와 인터페이스  (0) 2020.03.29
    객체, 클래스의 개념  (0) 2020.03.29
Designed by Tistory.