본문 바로가기
프로그래밍 언어/JAVA

JAVA - I/O 와 NIO 차이

by DGDD(Developer) 2024. 6. 21.

기본 파일 I/O ( java.io 패키지)

 1. 스트림 기반 I/O

  • java.io 는 스트림을 사용하여 데이터를 읽고 쓴다. 스트림은 연속된 데이터의 흐름을 처리하며, 바이트 스트림과 문자 스트림으로 나뉜다.
  • 바이트 스트림 : InputStream, OutputStream 및 그 하위 클래스( FileInputStream, FileOutputStream 등)
  • 문자 스트림 : Reader, Writer 및 그 하위 클래스( FileReader, FileWriter 등)

2. 블로킹 I/O

  • java.io의 I/O 작업은 블로킹 모드로 작동한다. 이는 I/O 작업이 완료될 때까지 스레드가 블로킹되는 것을 의미한다. 예를 들어, 파일을 읽는 동안 스레드가 해당 작업이 완료될 때까지 동작을 멈추는것을 말한다.

3. 상대적으로 간단한 API

  • java.io API는 사용하기 쉬운 편이다. 파일을 읽고 쓰는 작업을 수행하는 것이 비교적 직관적인 편에 속한다.
import java.io.*;

public class FileIOExample {
    public static void main(String[] args) {
        try (BufferedReader reader = new BufferedReader(new FileReader("example.txt"))) {
            String line;
            while ((line = reader.readLine()) != null) {
                System.out.println(line);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

 

NIO ( java.nio 패키지)

1. 버퍼 기반 I/O

  • java.nio는 버퍼를 사용하여 데이터를 읽고 쓴다. 버퍼는 데이터를 일시적으로 저장하고, 필요에 따라 버퍼의 데이터를 처리한다. 주로 ByteBuffer와 같은 버퍼 클래스를 사용한다.

2. 비블로킹 I/O

  • NIO는 비블로킹 모드를 지원한다. 이는 I/O 작업이 블로킹되지 않고, 작업이 즉시 완료되지 않더라도 다른 작업을 수행할 수 있음을 의미한다. 예를 들어, 채널을 통해 데이터를 읽는 작업이 완료되지 않아도 다른 작업을 수행할 수 있다는 뜻이다.
  • 비블로킹 I/O는 주로 멀티플랙싱(multiplexing)과 함께 사용되어, 하나의 스레드가 여러 채널을 관리할 수 있게 한다.

3. 향상된 성능

  • NIO는 대규모 데이터 전송 및 고성능 네트워크 I/O에 더 적합하다. 비블로킹 모드와 버퍼를 사용하면 성능을 더욱 최적화 시킬 수 있다.
import java.nio.file.*;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
import java.io.IOException;

public class NioFileReadExample {
    public static void main(String[] args) {
        try (FileChannel fileChannel = FileChannel.open(Paths.get("example.txt"), StandardOpenOption.READ)) {
            ByteBuffer buffer = ByteBuffer.allocate(1024);
            while (fileChannel.read(buffer) > 0) {
                buffer.flip();
                while (buffer.hasRemaining()) {
                    System.out.print((char) buffer.get());
                }
                buffer.clear();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

 

 

차이점 정리

특징 기본 파일 I/O NIO
I/O방식 스트림 기반 버퍼 기반
블로킹 블로킹 I/O 비블로킹 I/O
주요 클래스 InputStream, OutputStream. Reader, Writer Buffer, Channel, Selector
사용 용도 간단한 파일 I/O 작업, 소규모 데이터 처리 고성능, 대규모 데이터 전송, 네트워크 I/O
예제 FileInputStream, FileOutputStream, BufferedReader, BufferWriter FileChannel, ByteBuffer, Selector