반응형
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 |