[Day 9 | Java] 보조스트림 - Data(I/O)Stream

y♡ding·2024년 10월 24일
0

데브코스 TIL

목록 보기
48/163

보조 스트림이란?

보조 스트림(Secondary Stream)은 주 스트림을 감싸서 추가적인 기능을 제공하는 스트림입니다. 예를 들어, ObjectOutputStream바이트 스트림 위에 적용되어 객체를 직렬화하고 이를 바이트 스트림으로 처리하는 기능을 제공합니다.

  • 주 스트림: 파일, 네트워크 등에서 데이터를 실제로 읽고 쓰는 역할을 담당합니다(FileInputStream,FileOutputStream등)
  • 보조 스트림: 주 스트림에 부가적인 기능을 추가합니다.(예: 객체, 직렬화, 버퍼링 등)

DataInputStream / DataOutputStream 클래스 개요

DataInputStreamDataOutputStream은 자바에서 바이너리 데이터(이진 데이터)를 처리하기 위한 바이트 스트림 클래스입니다. 이 클래스를 사용하면 자바의 기본 데이터 타입을 효율적으로 바이너리 형식으로 읽고 쓸 수 있습니다. 즉, 정수, 실수, 논리 값과 같은 기본 자료형을 파일에 기록하거나, 파일에서 불러올 수 있습니다.

1. DataOutputStream: 데이터를 바이너리 형식으로 쓰기

DataOutputStream은 데이터를 바이너리 형식으로 파일이나 다른 스트림에 기록합니다. 이 클래스를 사용하면 기본 자료형을 텍스트가 아닌 이진 형식으로 저장할 수 있습니다. 주요 메서드는 각 데이터 타입에 맞는 write 메서드를 제공합니다.

  • 주요 메서드:
    • writeInt(int): 정수를 바이너리 형식으로 씀.
    • writeDouble(double): 실수를 바이너리 형식으로 씀.
    • writeBoolean(boolean): 논리 값을 바이너리 형식으로 씀.
    • writeUTF(String): 문자열을 UTF-8 형식으로 씀.

예제 코드:

DataOutputStream dos = null;
try {
    dos = new DataOutputStream(new FileOutputStream("./data.dat"));
    dos.writeInt(2024);      // 정수 쓰기
    dos.writeUTF("문자열 형식");  // 문자열 쓰기
    dos.writeFloat(1.8f);     // 실수 쓰기
    System.out.println("출력 완료");
} catch (IOException e) {
    System.out.println("[에러] " + e.getMessage());
} finally {
    if (dos != null) { try { dos.close(); } catch (IOException e) { }}
}

2. DataInputStream: 바이너리 데이터를 읽어오기

DataInputStream바이너리 형식으로 저장된 데이터를 읽어, 이를 기본 자료형으로 변환해 줍니다. 파일이나 네트워크에서 받은 이진 데이터를 처리할 때 유용하게 사용할 수 있습니다. 데이터를 기록한 순서대로 읽어야 하며, 이를 어기면 데이터가 잘못 해석될 수 있습니다.

  • 주요 메서드:
    • readInt(): 바이너리로 저장된 정수를 읽음.
    • readFloat(): 바이너리로 저장된 실수를 읽음.
    • readBoolean(): 바이너리로 저장된 논리 값을 읽음.
    • readUTF(): UTF-8 형식으로 저장된 문자열을 읽음.

예제 코드:

DataInputStream dis = null;
try {
    dis = new DataInputStream(new FileInputStream("./data.dat"));
    
    // 데이터를 쓴 순서대로 읽음
    System.out.println(dis.readInt());   // 정수 읽기
    System.out.println(dis.readUTF());   // 문자열 읽기
    System.out.println(dis.readFloat()); // 실수 읽기
} catch (IOException e) {
    System.out.println("[에러] " + e.getMessage());
} finally {
    if (dis != null) { try { dis.close(); } catch (IOException e) {} }
}

3. 바이너리 데이터를 사용하는 이유

  • 파일 크기 절감: 바이너리 형식으로 저장하면 데이터가 텍스트 형식보다 더 적은 공간을 차지합니다.
  • 네트워크 효율성: 바이너리 데이터는 전송 속도가 더 빠르고 효율적입니다.
  • 정확한 데이터 표현: 데이터가 텍스트로 변환되지 않고 정확한 이진 값으로 저장되기 때문에 데이터 손실이 없습니다.

4. 주의 사항

  1. 읽고 쓰는 순서의 일치: 데이터를 기록한 순서와 동일하게 읽어야 합니다. 예를 들어, 먼저 writeInt()로 기록한 후에는 readInt()로 읽어야 합니다.
  2. 텍스트 파일과 호환되지 않음: 바이너리 형식으로 저장된 파일은 일반 텍스트 편집기에서 열면 읽을 수 없는 값으로 표시됩니다.

5. 데이터 처리의 효율성

DataInputStreamDataOutputStream은 주로 네트워크 프로그래밍이나 파일 크기를 줄여야 할 때, 그리고 파일을 바이너리 형식으로 저장해야 할 때 사용됩니다. 또한 데이터를 효율적으로 처리하고 파일 크기를 줄이면서도, 기본 자료형 데이터를 손실 없이 저장할 수 있습니다.


이와 같은 스트림의 사용은 자바의 기본 자료형을 텍스트가 아닌 바이너리 형식으로 처리해야 할 때 매우 유용하며, 특히 성능이 중요한 파일 입출력 작업이나 네트워크 전송에서 많이 사용됩니다.

Oracle의 Java IO Docs.

0개의 댓글

관련 채용 정보