반응형
안녕하세요! 오늘은 자바에서 파일 입출력과 관련된 I/O 스트림 중 BufferedStream, ByteArrayStream, 그리고 DataStream을 사용하여 효율적인 데이터 처리 방법에 대해 알아보겠습니다. 🎉
자바 I/O는 다양한 스트림 클래스를 제공하여 데이터를 읽고 쓰는 작업을 쉽게 처리할 수 있도록 해줍니다. 아래 예제를 통해 기본적인 사용법과 주요 특징을 살펴볼게요! 🚀
1. BufferedStream: 성능 향상을 위한 버퍼링 활용 🛠️
📝 BufferedStream이란?
BufferedInputStream과 BufferedOutputStream은 데이터를 읽고 쓰는 동안 버퍼(buffer)를 사용하여 성능을 최적화합니다.
예제 코드 📜
private static String rootPath = System.getProperty("user.dir") + "\\files\\";
private static String source = rootPath + "img.jpg";
private static String target = rootPath + "img_buffered_copy.jpg";
public static void main(String[] args) {
System.out.println("원본: " + source);
System.out.println("복제본: " + target);
try (
InputStream fis = new FileInputStream(source);
OutputStream fos = new FileOutputStream(target);
BufferedInputStream bis = new BufferedInputStream(fis);
BufferedOutputStream bos = new BufferedOutputStream(fos)
) {
byte[] data = new byte[1024];
int size;
while ((size = bis.read(data)) != -1) {
bos.write(data);
System.out.println(size + "바이트 복사했습니다.");
}
} catch (IOException e) {
e.printStackTrace();
}
}
🔍 주요 포인트:
- BufferedInputStream과 BufferedOutputStream을 사용하면 대용량 파일을 처리할 때 속도가 빠릅니다.
- 배열 크기(1024 bytes)를 정해서 데이터를 한 번에 읽고 쓸 수 있습니다.
- 자원을 닫을 필요 없이 try-with-resources를 사용하여 자원을 안전하게 해제합니다.
실행 결과:
원본: ...\img.jpg
복제본: ...\img_buffered_copy.jpg
1024바이트 복사했습니다.
...
2. ByteArrayStream: 메모리 기반 입출력 처리 🖥️
📝 ByteArrayStream이란?
ByteArrayInputStream과 ByteArrayOutputStream은 메모리를 기반으로 데이터를 처리합니다. 파일이 아닌 메모리에서 데이터 작업을 수행할 때 유용합니다.
예제 코드 📜
public static void main(String[] args) {
byte[] inSrc = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
byte[] outSrc = null;
System.out.println("입력소스 : " + Arrays.toString(inSrc));
try (
InputStream bis = new ByteArrayInputStream(inSrc);
OutputStream bos = new ByteArrayOutputStream()
) {
int data;
while ((data = bis.read()) != -1) {
System.out.println("Read data: " + data);
bos.write(data);
}
outSrc = ((ByteArrayOutputStream) bos).toByteArray();
System.out.println("최종 결과 : " + Arrays.toString(outSrc));
} catch (IOException e) {
e.printStackTrace();
}
}
🔍 주요 포인트:
- 입력 소스와 출력 대상이 메모리 기반 배열로 처리됩니다.
- ByteArrayOutputStream을 통해 데이터를 가공하거나 조작할 때 편리합니다.
- try-with-resources로 자원 관리를 자동화합니다.
실행 결과:
입력소스 : [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
Read data: 0
Read data: 1
...
최종 결과 : [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
3. DataStream: 기본 데이터 타입 처리 📦
📝 DataStream이란?
DataInputStream과 DataOutputStream은 기본 데이터 타입(int, float, boolean, String 등)을 바이너리 형식으로 읽고 쓸 수 있도록 도와줍니다.
예제 코드 📜
private static String filename = System.getProperty("user.dir") + "\\files\\primitives.bin";
public static void main(String[] args) {
writePrimitives(); // 데이터 저장
readPrimitives(); // 데이터 읽기
}
private static void writePrimitives() {
try (
OutputStream fos = new FileOutputStream(filename);
DataOutputStream dos = new DataOutputStream(fos)
) {
dos.writeUTF("홍길동");
dos.writeBoolean(true);
dos.writeInt(25);
dos.writeFloat(80.9f);
dos.writeUTF("고길동");
dos.writeBoolean(false);
dos.writeInt(50);
dos.writeFloat(99.9f);
} catch (IOException e) {
e.printStackTrace();
}
}
private static void readPrimitives() {
try (
InputStream fis = new FileInputStream(filename);
DataInputStream dis = new DataInputStream(fis)
) {
for (int i = 0; i < 2; i++) {
System.out.println(dis.readUTF());
System.out.println(dis.readBoolean());
System.out.println(dis.readInt());
System.out.println(dis.readFloat());
}
} catch (IOException e) {
e.printStackTrace();
}
}
🔍 주요 포인트:
- 기본 데이터 타입을 바이너리 형식으로 저장하고 읽을 수 있습니다.
- 저장 순서대로 읽어야만 정확한 결과를 얻을 수 있습니다.
실행 결과:
홍길동
true
25
80.9
고길동
false
50
99.9
마무리 🎉
이번 글에서는 자바 I/O 스트림의 다양한 활용 방법을 살펴보았습니다. 각 스트림의 특징과 용도를 이해하고 프로젝트에 맞게 사용하면 효율적인 데이터 처리가 가능합니다. 💪
👉 요약:
- BufferedStream: 대용량 파일 처리 성능 향상
- ByteArrayStream: 메모리 기반 데이터 처리
- DataStream: 기본 데이터 타입의 바이너리 처리

반응형
'개발 > JAVA' 카테고리의 다른 글
Java 입출력 스트림 이해하기: Buffered 및 CharStream 사용 예제 (11) | 2025.01.21 |
---|---|
Java 파일 입출력 처리 및 파일 복사 예제 (8) | 2025.01.20 |
JAVA의 함수형 프로그래밍과 Stream 활용하기 (7) | 2025.01.16 |
Java 예외 처리: 기본부터 사용자 정의 예외까지 (8) | 2025.01.15 |
Java 예외 처리: 안전한 프로그램을 위한 기본 개념 (9) | 2025.01.14 |