개발/JAVA

자바 I/O 스트림 이해하기: BufferedStream, ByteArrayStream, DataStream 활용하기 ✨

예니03 2025. 1. 17. 10:51
반응형

안녕하세요! 오늘은 자바에서 파일 입출력과 관련된 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();
    }
}

🔍 주요 포인트:

  1. BufferedInputStream과 BufferedOutputStream을 사용하면 대용량 파일을 처리할 때 속도가 빠릅니다.
  2. 배열 크기(1024 bytes)를 정해서 데이터를 한 번에 읽고 쓸 수 있습니다.
  3. 자원을 닫을 필요 없이 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();
    }
}

🔍 주요 포인트:

  1. 입력 소스출력 대상이 메모리 기반 배열로 처리됩니다.
  2. ByteArrayOutputStream을 통해 데이터를 가공하거나 조작할 때 편리합니다.
  3. 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();
    }
}

🔍 주요 포인트:

  1. 기본 데이터 타입을 바이너리 형식으로 저장하고 읽을 수 있습니다.
  2. 저장 순서대로 읽어야만 정확한 결과를 얻을 수 있습니다.

실행 결과:

홍길동
true
25
80.9
고길동
false
50
99.9

 

 

마무리 🎉

이번 글에서는 자바 I/O 스트림의 다양한 활용 방법을 살펴보았습니다. 각 스트림의 특징과 용도를 이해하고 프로젝트에 맞게 사용하면 효율적인 데이터 처리가 가능합니다. 💪

👉 요약:

  • BufferedStream: 대용량 파일 처리 성능 향상
  • ByteArrayStream: 메모리 기반 데이터 처리
  • DataStream: 기본 데이터 타입의 바이너리 처리
반응형