NIO

Gunjoo Ahn·2022년 9월 16일
0

NIO

Java 1.4에 추가됐으며, New IO의 약자이다. 기존 자바 IO 패키지의 속도를 개선하기 위해서 나온 것이다.

NIO는 stream 대신에 channel과 buffer를 사용한다. Channel은 물건을 중간에서 처리하는 도매상이라 생각하면 된다. 그리고 버퍼는 도매상에서 물건을 사고, 소비자에게 물건을 파는 소매상으로 생각하면 된다. 따라서 소비자는 도매상인 channel을 만날일은 거의 없고 대부분 소매상인 buffer와 상호작용한다.

Channel vs Stream

StreamChannel
쓰고 읽는 방향단방향양방향
BlockingBlockingNon-Blocking도 가능
다루는 타입byte or byte[]Buffer

Example

public void writeFile(String fileName, String data) throws Exception{
	FileChannel channel = new FileOutputStream(fileName).getChannel();
    byte[] byteData = data.getBytes();
    ByteBuffer buffer = ByteBuffer.wrap(byteData);
    channel.write(buffer);
    channel.close();
}
public void readFile(String fileName) throws Exception{
	FileChannel channel = new FileInputStream(fileName).getChannel();
    ByteBuffer buffer = ByteBuffer.allocate(1024);
    channel.read(buffer);
    buffer.flip(); // buffer data 시작점으로 이동
    while(buffer.hasRemaining()){
    	System.out.print((char)buffer.get());
    }
    channel.close();
}

Buffer

A container for data of a specific primitive type.
A buffer is a linear, finite sequence of elements of a specific primitive type. Aside from its content, the essential properties of a buffer are its capacity, limit, and position
Oracle Java 8

버퍼의 상태 및 속성은 capacity, limit, position 메소드를 사용하여 확인한다. 버퍼는 CD처럼 위치가 있어 해당 위치부터 읽고, 쓴다.

버퍼를 다루기 위해 다양한 메소드가 제공된다.

  • mark를 통하여 어떤 포지션을 마킹할 수 있다.
  • reset을 하면 해당 마크된 포지션으로 이동할 수 있다.
  • clear를 하면 포지션은 0이 되고, limit은 capacity로 설정된다. 존재하던 마크들도 전부 사라진다. 이 메소드는 실제로 버퍼에 있는 데이터를 지우지는 않는다. Channel readput operation 할 때 사용한다.
  • flip을 하면 현재 포지션을 limit으로 설정하고, 포지션 0으로 이동한다. 만약 마크된 것들이 있으면 다 없앤다. Channel write이나 get operation 할 때 사용한다.
  • rewind를 하면 포지션을 0으로 이동하고 마크들을 삭제한다. flip에서 limit 설정만 하지 않는 것이다. Re-reading 할 때 사용한다.

따라서 버퍼의 각 값들은 아래와 같은 조건을 만족해야한다.

0 <= mark <= position <= limit <= capacity

Reference

자바의 신 개정판 2 27장, Serializable과 NIO도 살펴봅시다
https://homoefficio.github.io/2016/08/06/Java-NIO%EB%8A%94-%EC%83%9D%EA%B0%81%EB%A7%8C%ED%81%BC-non-blocking-%ED%95%98%EC%A7%80-%EC%95%8A%EB%8B%A4/
https://docs.oracle.com/javase/8/docs/api/java/nio/Buffer.html

profile
Backend Developer

0개의 댓글