기본 파일 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 |
'프로그래밍 언어 > JAVA' 카테고리의 다른 글
JAVA - 컬렉션 종류 (0) | 2024.06.21 |
---|---|
JAVA - 배열(Array) 와 컬렉션 (Collection)의 차이점 (0) | 2024.06.21 |
JAVA - 배열 복사하기 (2) | 2024.03.15 |
Java - 문자열(String) 과 정수(int) 변환 (0) | 2024.03.13 |
Java - 대소문자 구분 / 대소문자 변환 (문자) (0) | 2024.03.13 |