Akashic Records

자바 nio - 9 본문

오래된글/Java

자바 nio - 9

Andrew's Akashic Records 2018. 4. 9. 11:31
728x90

9. java.nio.channels 인터페이스

이번장에서는 java.nio.channels 패키지에 정의되어있는 7개의 인터페이스를 살펴보자. 이들 인터페이스는 채널관련 클래스들이 주로 사용하는 메서드를 정의, 채널 클래스류에게 제공해 준다. 따라서 인터페이스와 그에 따를 메서드를 반드시 알아두는 것이 좋다.

1. java.nio.channels 인터페이스 계층도



1. Channel 인터페이스 --> 모든 채널 클래스류의 최상위 인터페이스

먼저 Channel이라는 기본적인 인터페이스가 있다. 이는 모든 인터페이스들이 상속을 받으므로 Channel 인터페이스가 가진 메서드는 모드 사용할 수 있다. 메서드는 다음과 같다.

- public boolean isOpen() : 현재의 채널 상태가 오픈일지 아닌지를 판단, 리턴. 현재의 채널이 오픈일 경우 true 리턴.

- public void close() throws IOException : 현재의 채널을 닫는다.이때 닫힌 채널로 입출력 조작을 실시하려고 하면ClosedChannelException 가 발생. 채널이 닫힌 상태에서 이 메소드를 호출해도, 아무런 효과도 없다.


2. InterruptibleChannel 인터페이스 --> 블로킹된 스레드(입출력)를 깨우는 기능 ==> non-blocking 기능

채널 입출력 중 다른 스레드에 의해 채널이 중단될 수 있음을 나타내는 인터페이스이다. 다음의 메서드를 선언한다.

- public void close() throws IOException

: close() 는 Channel 인터페이스에도 있지만 InterruptibleChannel의 close()는 blocking된 입출력에 대해 java.nio.channels.AsynchronousCloseException 예외를 발생시키는 방법으로 스레드를 깨어나게 해준다. AsynchronousCloseException 예외란 다른 thread가 채널 또는 입출력 조작시에 블록 되는 채널의 일부를 클로우즈 했을 때에 thread가 받는 체크 예외이다.

New I/O의 모든 채널 클래스들은 이 인터페이스를 구현하고 있으므로 모든 채널은 blocking 중에 다른 스레드에 의해 깨어날 수 있는 것이다. 이것은 중요한 특성으로 파일처리뿐만 아니라 나중에 네트워크에 관한 사항을 다룰때 나오는 Selector에 관련된 내용이기도 하다.

InterruptibleChannel을 구현하는 클래스로는 FileChannel, DatagramChannel, SocketChannel, ServerSocketChannel, Pipe.SinkChannel, Pipe.SourceChannel 이 있다.


3. ReadableByteChannel 인터페이스 --> 읽기를 위한 인터페이스

ReadableByteChannel 에는 읽기위한 메서드를 가지고 있다.

- public int read(ByteBuffer dst) throws IOException

: 채널로 부터 데이터를 읽어들인다. 인자로 들어온 ByteBuffer의 position으로부터 채널의 데이터들이 들어 오게 되며, limit까지 진행된다. 이때 읽는 곳의 위치와 데이터 개수의 최대값은 버퍼의 position과 limit의 범위이다. 스트림을 끝까지 읽으면 -1을 반환한다. 이 메서드를 호출시 발생하는 예외는 다음과 같다.

NonReadableChannelException - 이 채널이 읽어들여 가능하지 않은 경우

ClosedChannelException - 이 채널이 클로우즈 하고 있는 경우

AsynchronousCloseException - read 조작의 진행중에, 다른 thread에 의해 이 채널이 클로우즈 되었을 경우

ClosedByInterruptException - read 조작의 진행중에 다른 thread로부터의 세치기가 있었기 때문에 채널이 클로우즈 해, 현재의 thread의 세치기 상태가 설정되었을 경우

IOException - 그 외의 입출력 에러가 발생했을 경우


4. WritableByteChannel 인터페이스 --> 쓰기를 위한 인터페이스

WritableByteChannel 에는 쓰기위한 메서드를 가지고 있다.

- public int write(ByteBuffer src) throws IOException

: 채널에 데이터를 출력한다. 인자로 들어온 ByteBuffer의 position으로부터 limit까지 데이터를 출력한다. 이때 쓰는 곳의 위치와 데이터 개수의 최대값은 버퍼의 position과 limit의 범위이다. 리턴값은 출력하는 데이터수이다. 이 메서드를 호출시 발생하는 예외는 다음과 같다.

NonWritableChannelException - 이 채널이 출력이 가능하지 않은 경우

ClosedChannelException - 이 채널이 클로우즈 하고 있는 경우

AsynchronousCloseException - 출력중에 다른 thread에 의해 이 채널이 클로우즈 되었을 경우

ClosedByInterruptException - 출력중에 다른 thread로부터의 Interrupt가 있었기 때문에 채널이 클로우즈 해, 현재의 thread의 Interrupt 상태가 설정되었을 경우

IOException - 그 외의 입출력 에러가 발생했을 경우


5. ScatteringByteChannel 인터페이스와 GatheringByteChannel인터페이스 --> 여러개의 버퍼를 읽어들이거나 쓰는 것을 지원한다.

ScatteringByteChannel는 ReadableByteChannel의 하위 인터페이스로서 여러개의 ByteBuffer에서 데이터를 읽어들일 수 있다.

- public long read(ByteBuffer [] dsts) throws IOException

- public long read(ByteBuffer [] dsts, int offset, int length) throws IOException

GatheringByteChannel는 WritableByteChannel의 하위 인터페이스로서 여러개의 ByteBuffer에서 데이터를 출력할 수 있다.

- public long write(ByteBuffer [] srcs) throws IOException

- public long write(ByteBuffer [] srcs, int offset, int length) throws IOException

이들 메서드는 각각 여러 개의 버퍼들에 대해 순차적으로 하나씩 데이터들을 써나가거나 읽어들이게 된다. 여러 개의 버퍼들에 대해 순차적으로 데이터를 써나가거나 읽어들이기 때문에 데이터의 구조가 어떻게 되어 있는지를 미리 알고 있으며, 이들을 여러 버퍼에 쓰거나 읽어들여야 할 때에는 유용하게 쓰인다. 그래서 여러 데이터 유형을 가진 이런 메서드들은 작업을 간편하게 만들어준다.


6. ByteChannel 인터페이스 --> 데이터의 읽기와 쓰기를 지원한다.

ByteChannel 은 ScatteringByteChannel 인터페이스와 GatheringByteChannel인터페이스를 상속받으므로 읽기와 쓰기를 동시에 할 수 있다. 따라서 앞으로 많이 사용하는 인터페이스이다. 이 인터페이스는 단지 ScatteringByteChannel 인터페이스와 GatheringByteChannel인터페이스를 통합한다는 것뿐 다른 기능은 없다.

ByteChannel 인터페이스를 구현하는 클래스로는 FileChannel, DatagramChannel, SocketChannel이다.

채널의 기본 입출력 버퍼는 ByteBuffer 이다.

위에서 살펴본 인터페이스들에 Byte라는 낱말이 들어가 있는데 이는 채널의 기본 입출력이 ByteBuffer임을 말해준다. 그러므로 다른 유형의, 예를 들면 CharBuffer나 FloatBuffer 등을 쓰고자 한다면 ByteBuffer의 asXXXBuffer()류 메서드를 이용해서 바탕은 ByteBuffer이지만 다른 데이터 유형으로 다룰 수 있는 버퍼를 만들어야 한다.


728x90

'오래된글 > Java' 카테고리의 다른 글

자바 nio - 11  (0) 2018.04.09
자바 nio - 10  (0) 2018.04.09
자바 nio - 8  (0) 2018.04.09
자바 nio - 7  (0) 2018.04.09
자바 nio - 6  (0) 2018.04.09
Comments