백엔드/Java

자바 NIO의 동작 방식과 사용법

개발자K씨 2024. 1. 4. 20:56

자바 NIO(New Input / Output)는 'java.nio' 패지키에 속한 API로 Java 1.4부터 도입된 고성능 IO 기능을 제공합니다.

NIO는 비동기적인 데이터 처리, 채널(Channel)과 버퍼(Buffer)를 사용한 효율적인 데이터 관리, 멀티플렉싱을 통한 높은 성능의 IO 작업을 가능하게 합니다.

NIO는 네트워킹, 파일 처리 등 다양한 영역에서 활용됩니다.

 

NIO의 핵심 구성요소

  • 채널(Channel): 데이터의 소스나 목적지를 나타내는 역할을 합니다. 예를 들면 파일, 소켓 등이 있습니다.
  • 버퍼(Buffer): 데이터를 임시 저장하는 메모리 공간으로, 데이터를 읽고 쓰는 과정에서 중요한 역할을 합니다.
  • 셀렉터(Selector): 단일 스레드에서 여러 채널의 IO 이벤트를 모니터링 할 수 있습니다.

채널과 버퍼의 동작 방식

  • 데이터는 버퍼를 통해 채널로 읽히거나 채널에서 버퍼로 쓰여집니다.
  • 버퍼는 크게 'ByteBuffer', 'CharBuffer', 'IntBuffer" 등 다양한 기본 데이터 타입을 지원합니다.
  • 채널을 통한 데이터 읽기/쓰기는 버퍼를 통해 이루어지며, 이 과정에서 비동기식 처리가 가능합니다.

자바 NIO 사용 예시

파일 읽기

Path file = Paths.get("example.txt");

try (SeekableByteChannel channel = Files.newByteChannel(file)) {
	ByteBuffer buffer = ByteBuffer.allocate(1024);
	while (channel.read(buffer) > 0) {
		buffer.flip();
		while (buffer.hasRemaining()) {
			System.out.print((char) buffer.get());
		}
		buffer.clear();
	}
} catch (IOException e) {
	e.printStackTrace();
}

 

파일 쓰기

Path file = Paths.get("src/main/resources/output.txt");

try (SeekableByteChannel channel = Files.newByteChannel(file, StandardOpenOption.WRITE)) {
	ByteBuffer buffer = ByteBuffer.wrap("Hello World!".getBytes());
	channel.write(buffer);
} catch (IOException e) {
	e.printStackTrace();
}

 

결론

자바 NIO는 네트워킹, 파일 처리 등 복잡한 I/O 작업을 효율적으로 관리할 수 있게 해주는 강력한 툴입니다.

비동기 처리와 높은 I/O 성능을 필요로 하는 애플리케이션에 적합하며, 적절한 사용법을 익히면 더욱 효과적인 프로그래밍이 가능합니다.