본문 바로가기
프로그래밍 언어/JAVA

NIO - Buffer

by 규봉봉이 2020. 4. 3.

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