-
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 <-> IntBufferint 타입은 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