입출력(IO)은 파일, 네트워크, 콘솔 등 다양한 소스로부터 데이터를 읽고 쓰는 작업을 처리합니다. 자바의 IO는 주로 java.io 패키지와 java.nio(New IO) 패키지를 통해 제공됩니다. 여기서는 자바의 기본 IO와 NIO에 대해 상세히 설명하겠습니다.
1. java.io 패키지
java.io 패키지는 자바의 전통적인 IO 클래스들을 포함하고 있으며, 스트림 기반 입출력을 제공합니다. 이 패키지의 주요 클래스들은 바이트 스트림과 문자 스트림으로 나눌 수 있습니다.
바이트 스트림
바이트 스트림은 바이너리 데이터를 처리하는 데 사용됩니다. 주로 이미지, 비디오, 오디오 파일 등과 같은 바이너리 파일을 다룰 때 사용됩니다.
주요 클래스
- InputStream: 바이트 입력 스트림의 최상위 클래스입니다.
- FileInputStream: 파일에서 바이트 단위로 데이터를 읽습니다.
- BufferedInputStream: 입력 스트림에 버퍼링을 추가하여 효율성을 높입니다.
- DataInputStream: 기본 데이터 타입을 읽는 메서드를 제공합니다.
- OutputStream: 바이트 출력 스트림의 최상위 클래스입니다.
- FileOutputStream: 파일에 바이트 단위로 데이터를 씁니다.
- BufferedOutputStream: 출력 스트림에 버퍼링을 추가하여 효율성을 높입니다.
- DataOutputStream: 기본 데이터 타입을 쓰는 메서드를 제공합니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class ByteStreamExample {
public static void main(String[] args) {
try (FileInputStream fis = new FileInputStream("input.txt");
FileOutputStream fos = new FileOutputStream("output.txt")) {
int byteData;
while ((byteData = fis.read()) != -1) {
fos.write(byteData);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
|
cs |
문자 스트림
문자 스트림은 문자 데이터를 처리하는 데 사용됩니다. 주로 텍스트 파일을 다룰 때 사용됩니다.
주요 클래스
- Reader: 문자 입력 스트림의 최상위 클래스입니다.
- FileReader: 파일에서 문자 단위로 데이터를 읽습니다.
- BufferedReader: 입력 스트림에 버퍼링을 추가하여 효율성을 높입니다.
- InputStreamReader: 바이트 스트림을 문자 스트림으로 변환합니다.
- Writer: 문자 출력 스트림의 최상위 클래스입니다.
- FileWriter: 파일에 문자 단위로 데이터를 씁니다.
- BufferedWriter: 출력 스트림에 버퍼링을 추가하여 효율성을 높입니다.
- OutputStreamWriter: 바이트 스트림을 문자 스트림으로 변환합니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
public class CharStreamExample {
public static void main(String[] args) {
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();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
|
cs |
객체 직렬화
객체 직렬화는 객체를 바이트 스트림으로 변환하여 파일에 저장하거나 네트워크를 통해 전송할 수 있게 합니다. 직렬화 가능한 객체는 Serializable 인터페이스를 구현해야 합니다.
주요 클래스
- ObjectOutputStream: 객체를 직렬화하여 출력 스트림에 씁니다.
- ObjectInputStream: 입력 스트림에서 객체를 역직렬화하여 읽습니다.
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
32
33
34
|
import java.io.*;
class Person implements Serializable {
private static final long serialVersionUID = 1L;
String name;
int age;
Person(String name, int age) {
this.name = name;
this.age = age;
}
}
public class SerializationExample {
public static void main(String[] args) {
Person person = new Person("John", 30);
// 직렬화
try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("person.ser"))) {
oos.writeObject(person);
} catch (IOException e) {
e.printStackTrace();
}
// 역직렬화
try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream("person.ser"))) {
Person deserializedPerson = (Person) ois.readObject();
System.out.println("Name: " + deserializedPerson.name + ", Age: " + deserializedPerson.age);
} catch (IOException | ClassNotFoundException e) {
e.printStackTrace();
}
}
}
|
cs |
2. java.nio 패키지
java.nio는 New IO 패키지로, 기존 IO보다 더 빠르고 유연한 비동기 입출력을 제공합니다. 주로 채널(Channel)과 버퍼(Buffer)를 사용하여 입출력을 처리합니다.
주요 클래스
- Buffer: 데이터를 담는 컨테이너입니다. (예: ByteBuffer, CharBuffer)
- Channel: 데이터의 읽기와 쓰기를 지원합니다. (예: FileChannel, SocketChannel)
- Path: 파일 경로를 나타내는 클래스입니다.
- Files: 파일 작업을 위한 유틸리티 메서드를 제공합니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
public class NIOFileCopyExample {
public static void main(String[] args) {
Path sourcePath = Paths.get("input.txt");
Path destinationPath = Paths.get("output.txt");
try {
Files.copy(sourcePath, destinationPath);
System.out.println("File copied successfully!");
} catch (IOException e) {
e.printStackTrace();
}
}
}
|
cs |
버퍼와 채널
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
|
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 NIOBufferChannelExample {
public static void main(String[] args) {
Path path = Path.of("input.txt");
try (FileChannel fileChannel = FileChannel.open(path, StandardOpenOption.READ)) {
ByteBuffer buffer = ByteBuffer.allocate(1024);
int bytesRead = fileChannel.read(buffer);
while (bytesRead != -1) {
buffer.flip();
while (buffer.hasRemaining()) {
System.out.print((char) buffer.get());
}
buffer.clear();
bytesRead = fileChannel.read(buffer);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
|
cs |
차이점 요약
- java.io:
- 스트림(Stream) 기반
- 블로킹 IO
- 간단하고 사용하기 쉬움
- 작은 파일이나 간단한 입출력 작업에 적합
- java.nio:
- 버퍼(Buffer)와 채널(Channel) 기반
- 논블로킹 IO
- 대용량 파일이나 네트워크 통신에 적합
- 비동기 입출력을 지원하여 고성능 애플리케이션에 유리
자바의 IO는 다양한 요구를 충족시키기 위해 설계되었습니다. java.io 패키지는 간단하고 직관적인 방식으로 입출력을 처리할 수 있으며, java.nio 패키지는 더 복잡한 입출력 요구 사항을 처리하는 데 적합합니다. 사용자는 애플리케이션의 요구 사항에 따라 적절한 패키지를 선택하여 사용할 수 있습니다.