CHAPTER 1 . 기본 NIO(New Input/Output) (1/2)
NIO의 특징
- 저 레벨 I/O에 대한 새로운 모델을 제공
- 블록 단위의 데이터 입.출력 (버퍼 사용) 즉 한꺼번에 많은 양을 처리할 수 있음
- Direct Buffer 사용
- 다이렉트 버퍼의 개념 - JVM를 통하지 않고 시스템 레벨에서 직접 수행
- 넌 블록킹 I/O 형태의 플랫폼 독립성을 제공
- 다중 쓰레드 프로그램밍을 간략화 시킬 수 있음
- 기본 I/O API는 내부적으로 NIO로 재 작성됨
채널과 버퍼
- 채널 : I/O 스트림에 해당
- 읽고 쓸 때 버퍼를 사용
- 양방향성을 지원(입력/출력)
- 관련 메소드 getChannel()
- 순수 자바 스트림에는 채널을 지원하지 않음
- ByteArrayOutputStream , FilterInputStream
- InputStream, OutputStream 채널 지원 하지 않음, 즉 일반적이지 않음
- 채널에 읽기와 쓰기
- public int read(ByteBuffer dst);
- 채널 --> 버퍼
- public void write(ByteBuffer src);
- 버퍼 --> 채널
Buffer에 대해서
- 생성하기
- allocate() : 메모리를 할당
- allocateDirect() : 직접 메모리 할당
- wrap() : 배열로 부터 생성하고 배열와 동기화 한다.
- get() 과 put()
- 두 메소드 구분에는 상대적인 과 절대적인 있고 구분 기준은 Index 임
- Index를 있으면 절대적
- put()
- 소스 -> 버퍼 : 버퍼에 넣기
- get()
- 버퍼 --> 목적 : 버퍼에서 얻기
- 버퍼 상태 값
- position : 작업할 인텍스 값
- limit : 실제 크기
- capacity : 전체 크기
- remaining() : limit - position
- 상태 변경 메소드
- flip() : 읽기에서 쓰기로 변경
- clear() : 초기화 하기
- ByteBuffer의 디폴트 바이트 순서는 Big-Endian 임
- order(ByteOrder) 으로 변경 가능 함
- ByteOrder.nativeOrder() : 플랫폼의 바이트 order를 찾을 수 있음
Direct buffer
- 일반 버퍼보다 빠르다
기본 예제
package ns.jdk14;
import java.io.*;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
public class NIOBufferTest {
public static void main(String[] args) throws IOException{
//읽기 채널
FileChannel ifc =
new FileInputStream("test/hi.txt").getChannel();
//쓰기 채널
FileChannel ofc =
new FileOutputStream("test/out.txt").getChannel();
ByteBuffer bbf = ByteBuffer.allocate(1024);
while(true) {
int ret = ifc.read(bbf);
if (ret == -1) break; //읽기 완료됨
bbf.flip(); //이것은 반드시 해야 함
ofc.write(bbf);
//bbf.clear(); //안해도 그만 이것은 하지 않으면 프로세스 종료 되질 않네요
//만약 위 clear() 호출하지 않는 대신에 아래 메소드를 호출 하면된다. 2개를
bbf.limit(bbf.capacity());
bbf.position(0);
}
}
}
|
- 스트림 기반 방식은 편리함과 유연성을 제공
- 채널과 버퍼 방식은 Bulk 테이터(Buffer)를 취급 하여 빠른 속도 측면을 제공
즉 OS 레벨의 IO 속도 성능을 가질 수 있게 됨
출처 : 인포북 JDK 1.4 Tutorial
댓글 없음:
댓글 쓰기