Notice
Recent Posts
Recent Comments
Link
«   2026/03   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
Tags more
Archives
Today
Total
관리 메뉴

프로그래밍 공부

[자바] #25. NIO / NIO.2 본문

자바

[자바] #25. NIO / NIO.2

하 냥 2025. 3. 3. 17:47

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