프로그래밍 공부
[자바] #25. NIO / NIO.2 본문
Java에서 입출력(I/O)을 다루는 대표적인 방식에는 기본적인 I/O (java.io 패키지)와
New I/O (NIO, java.nio 패키지) 그리고 NIO.2 (java.nio.file 및 기타 보강된 기능)가 있다.
📚 Java NIO란?
Java NIO는 기존의 java.io 패키지를 보완하며, 비동기적이고 버퍼 기반의 고성능 I/O를 지원하는 API이다.
(1) NIO의 주요 특징
- 버퍼(Buffer) 기반: 기존의 InputStream 및 OutputStream은 바이트 스트림을 직접 처리했지만, NIO는 Buffer를 활용하여 데이터를 처리
- 채널(Channel) 기반: 기존 I/O는 스트림(Stream) 기반이지만, NIO에서는 Channel을 통해 읽기/쓰기 작업을 수행
- 비동기(Non-blocking) I/O: Selector를 활용한 다중 채널 처리가 가능하여, 블로킹 없이 I/O 작업을 수행할 수 있음
- 파일, 네트워크, 메모리 매핑 지원: FileChannel, SocketChannel, DatagramChannel, MappedByteBuffer 등 다양한 I/O 지원
(2) NIO의 주요 컴포넌트
| 컴포넌트 | 설명 |
| Buffer | 데이터를 저장하고 조작하는 객체 (ByteBuffer, CharBuffer 등) |
| Channel | I/O 소스와 데이터를 연결하는 통로 (FileChannel, SocketChannel 등) |
| Selector | 비동기 방식으로 다중 채널을 감시하는 객체 |
📍 Java NIO 주요 기능 및 예제 코드
(1) Buffer
Buffer는 데이터를 저장하는 객체이며, NIO에서는 데이터를 읽고 쓰는 모든 작업이 버퍼를 통해 수행된다.
주요 버퍼 타입으로는 ByteBuffer, CharBuffer, IntBuffer, DoubleBuffer, LongBuffer 등이 있다.
// 예제: ByteBuffer 사용법
import java.nio.ByteBuffer;
public class ByteBufferExample {
public static void main(String[] args) {
ByteBuffer buffer = ByteBuffer.allocate(10); // 10바이트 크기의 버퍼 생성
// 데이터 쓰기
buffer.put((byte) 1);
buffer.put((byte) 2);
buffer.put((byte) 3);
buffer.flip(); // 읽기 모드로 전환
// 데이터 읽기
while (buffer.hasRemaining()) {
System.out.println(buffer.get());
}
}
}
(2) Channel
Channel은 입출력 소스와 연결된 데이터의 흐름을 관리하는 객체이다.
주요 채널 타입으로는 FileChannel, SocketChannel, ServerSocketChannel 등이 있다.
// 예제: FileChannel을 이용한 파일 읽기
import java.io.RandomAccessFile;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
public class FileChannelExample {
public static void main(String[] args) throws Exception {
RandomAccessFile file = new RandomAccessFile("example.txt", "r");
FileChannel channel = file.getChannel();
ByteBuffer buffer = ByteBuffer.allocate(1024);
int bytesRead = channel.read(buffer);
while (bytesRead != -1) {
buffer.flip(); // 읽기 모드로 전환
while (buffer.hasRemaining()) {
System.out.print((char) buffer.get());
}
buffer.clear(); // 다시 쓰기 모드로 전환
bytesRead = channel.read(buffer);
}
channel.close();
file.close();
}
}
📚 Java NIO.2란?
Java 7부터 기존 NIO를 확장한 NIO.2가 도입되었다.
주로 java.nio.file 패키지를 통해 파일 시스템과의 상호작용을 강화하였다.
(1) 주요 기능
| 기능 | 설명 |
| Path | 기존 File 클래스 대체 (파일 및 디렉터리 경로 표현) |
| Files | 파일 읽기, 쓰기, 복사, 삭제 등의 기능 제공 |
| FileVisitor | 파일 트리 순회 지원 |
| WatchService | 파일 변경 감지 기능 |
(2) 주요 예제
// Path 및 Files 활용
import java.nio.file.*;
public class NIO2Example {
public static void main(String[] args) throws Exception {
Path path = Paths.get("example.txt");
// 파일 읽기
byte[] bytes = Files.readAllBytes(path);
System.out.println(new String(bytes));
// 파일 쓰기
Files.write(path, "Hello, NIO.2!".getBytes(), StandardOpenOption.APPEND);
}
}
결론
| 기능 | I/O (java.io) | NIO (java.nio) | NIO.2 (java.nio.file) |
| 방식 | 스트림 기반 | 채널 및 버퍼 기반 | 채널 및 파일 시스템 API |
| 동기/비동기 | 동기 | 동기 및 비동기 | 동기 및 비동기 |
| 주요 사용처 | 간단한 I/O 작업 | 대용량 데이터 처리 | 파일 시스템 조작 |
- 단순한 파일 I/O 작업: java.io
- 성능이 중요한 I/O 처리: java.nio
- 파일 및 디렉터리 관련 작업: java.nio.file
'자바' 카테고리의 다른 글
| [자바] #26. 쓰레드 (Thread) (1) | 2025.03.03 |
|---|---|
| [자바] #24. I/O 스트림 (0) | 2025.03.01 |
| [자바] #23. 날짜/시간 관련 클래스들 (1) | 2025.02.23 |
| [자바] #22. 스트림(Stream) - 3편 (최종 연산 추가 내용) (0) | 2025.02.21 |
| [자바] #21. 스트림(Stream) - 2편 (병렬 스트림, 중간 연산 추가 내용) (0) | 2025.02.21 |