2016년 6월 15일 수요일

JDK 1.4 튜토리얼 - 1장(1/2)

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);
      }
  }
}
채널과 버퍼를 이용한 IO 수행 특징

  • 스트림 기반 방식은 편리함과 유연성을 제공
  • 채널과 버퍼 방식은 Bulk 테이터(Buffer)를 취급 하여 빠른 속도 측면을 제공
    즉 OS 레벨의 IO 속도 성능을 가질 수 있게 됨

출처 : 인포북 JDK 1.4 Tutorial

댓글 없음: