본문 바로가기
Programming/Java

JAVA NIO와 IO의 차이점

by d-e-v-j 2024. 11. 17.
반응형

Java는 입출력(IO) 처리를 위해 두 가지 주요 API를 제공합니다. IO(Input/Output)와 NIO (New Input/Output).

이 두가지는 데이터 처리 방식, 성능, 사용목적에서 큰 차이가 있습니다.

 

1. Java IO와 NIO

IO(Input/Output)

  • Java IO는 스트림 기반의 동기방식 API입니다.
  • 데이터를 하나씪 처리하며, 동기적으로 데이터를 읽고 씁니다.
  • Java 초기 버전부터 제공된 표준 API로 간단한 파일처리, 네트워크 소켓 통신 등에 사용됩니다.

NIO(New Input/Output)

  • Java NIO는 버퍼기반의 비동기 방식 API 입니다.
  • 효율적으로 대규모 데이터를 처리하도록 설계되었습니다.
  • 채널, 셀렉터, 버퍼를 사용하여 다중 클라이언트와 비동기 네크워크 처리를 지원합니다.

 

2. IO와 NIO의 차이점

특징 IO ( Stream) NIO (Channel/Buffer)
데이터 처리 방식 스트림기반:데이터를 하나씪 처리. 버퍼 기반:데이터를 블록 단위로 처리
동기/비동기 동기 처리 비동기 처리
블로킹 여부 블로킹방식: 작업이 완료될 때까지 쓰레드 대기 논블로킹 방식: 쓰레드가 계속 실행될 수 있음
구조 InputStream, OutputStream Channel, Buffer, Selector
성능 적은 데이터 처리에 적합 대규모 데이터 처리 및 네트워크 작업에 최적화
유연성 단순하고 직관적 복잡하지만 고성능 및 비동기 처리를 제공

 

3. Java NIO 와 IO 활용법

IO 활용

  • 읽기 /쓰기
import java.io.*;

public class FileIOExample {
    public static void main(String[] args) throws IOException {
        try (BufferedReader reader = new BufferedReader(new FileReader("input.txt"));
             BufferedWriter writer = new BufferedWriter(new FileWriter("output.txt"))) {

            String line;
            while ((line = reader.readLine()) != null) {
                writer.write(line);
                writer.newLine();
            }
        }
    }
}

 

  • 네트워크 소켓 통신
import java.io.*;
import java.net.Socket;

public class IOSocketExample {
    public static void main(String[] args) throws IOException {
        Socket socket = new Socket("example.com", 80);
        PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
        BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));

        out.println("GET / HTTP/1.1");
        out.println("Host: example.com");
        out.println();
        System.out.println(in.readLine());
        socket.close();
    }
}

 

NIO 활용

  • 읽기 /쓰기
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
import java.nio.file.Path;
import java.nio.file.StandardOpenOption;

public class FileNIOExample {
    public static void main(String[] args) throws IOException {
        Path inputPath = Path.of("input.txt");
        Path outputPath = Path.of("output.txt");

        try (FileChannel inputChannel = FileChannel.open(inputPath, StandardOpenOption.READ);
             FileChannel outputChannel = FileChannel.open(outputPath, StandardOpenOption.WRITE, StandardOpenOption.CREATE)) {

            ByteBuffer buffer = ByteBuffer.allocate(1024);
            while (inputChannel.read(buffer) > 0) {
                buffer.flip(); // 읽기 모드로 전환
                outputChannel.write(buffer);
                buffer.clear(); // 쓰기 모드로 전환
            }
        }
    }
}

 

  • 비동기 네트워크 소켓 통신
import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.ServerSocketChannel;
import java.nio.channels.SocketChannel;

public class NIONetworkExample {
    public static void main(String[] args) throws IOException {
        ServerSocketChannel serverChannel = ServerSocketChannel.open();
        serverChannel.bind(new InetSocketAddress(8080));
        serverChannel.configureBlocking(false); // 논블로킹 모드 설정

        while (true) {
            SocketChannel socketChannel = serverChannel.accept();
            if (socketChannel != null) {
                ByteBuffer buffer = ByteBuffer.allocate(1024);
                buffer.put("Hello, NIO!".getBytes());
                buffer.flip();
                socketChannel.write(buffer);
                socketChannel.close();
            }
        }
    }
}

 

4. IO와 NIO 선택 기준

상황 IO NIO
파일의 크기가 작거나 단순한 읽기/쓰기 작업 적합 덜 적합
대규모 데이터 처리, 성능이 중요한 경우 비효율적 적합
비동기 작업, 다중 클라이언트 처리 적합하지 않음 최적화
사용하기 간단한 API가 필요한 경우 적합 복잡
728x90
반응형
LIST

'Programming > Java' 카테고리의 다른 글

JAVA 대용량 트래픽 관리 방법  (1) 2024.12.19
Test Code 의 중요도  (1) 2024.12.10
Java Reflection API에 대하여  (0) 2024.11.11
JAVA Edge 브라우저 열기  (0) 2024.11.08
JAVA 스레드(Thread) 란 무엇인가?  (3) 2024.11.06