[Java] 바이트 입출력 스트림

Bam·2024년 3월 22일
0

Java

목록 보기
88/98
post-thumbnail

바이트 스트림

바이트 스트림은 이미지, 동영상, 오디오, 텍스트 등 모든 형태의 데이터를 입출력할 수 있는 스트림입니다.


바이트 출력 스트림

OutputStream은 바이트 출력 스트림의 최상위 클래스이자 추상 클래스입니다. 이 클래스 아래에 다양한 출력에 대비한 FileOutputStream, PrintStream, BufferedOutputStream, DataOutputStream이 자식 클래스로 존재하고 있습니다.

OutputStream 클래스에서는 바이트 출력 스트림에서 공통적으로 사용되는 메소드들을 정의하고 있습니다.

메소드설명
write(int b)1 byte 출력
write(byte[] b)배열 b의 모든 바이트 출력
write(byte[] b, int off, int len)배열 b의 off부터 len개의 바이트 출력
flush()출력 버퍼에 잔류한 모든 바이트 출력
close()출력 스트림을 닫고 메모리 해제

다음 코드는 FileOutputStream을 이용해서 바이트를 저장하는 예제입니다.

public class Main {
    public static void main(String[] args) throws IOException {
        OutputStream outputStream = new FileOutputStream("data.db");

        byte x = 1;
        byte y = 2;
        byte z = 3;

        outputStream.write(x);
        outputStream.write(y);
        outputStream.write(z);

        outputStream.flush();
        outputStream.close();	//스트림 종료와 메모리 해제
    }
}

이 코드를 실행하면 프로젝트 파일 내에 data.db라는 파일이 하나 생성되었을 것입니다. 이 문자들은 데이터 통신에서 사용되는 통신 제어 문자SOH는 데이터 헤더의 시작을 알리고, STX는 텍스트의 시작, ETX는 텍스트의 종료를 알리는 의미를 가지고 있습니다.

FileOutputStream 생성자가 파일 생성에 실패하거나 write(), flush(), close() 메소드는 IOException 예외를 발생시킬 수 있기 때문에 예제에서는 생략했지만 예외처리 구문을 작성할 필요가 있습니다.

입출력으로 FileOutputStream, FileInputStream만을 다루지만 나머지 종류의 스트림에서도 읽고 쓰기에 대한 방식은 동일합니다.


바이트 입력 스트림

InputStream은 바이트 입력 스트림의 최상위 클래스이자 추상 클래스입니다. 마찬가지로 다양한 입력에 대비해 FileInputStream, BufferedInputStream, DataInputStream을 자식 클래스를 가지고 있습니다.

마찬가지로 InputStream 클래스도 입력 스트림에서 공통적으로 사용되는 메소드들을 가지고 있습니다.

메소드설명
int read()1 byte를 읽고 해당 바이트 반환
int read(byte[] b)읽은 바이트를 배열 b에 저장하고 읽은 바이트 개수 리턴
void close()입력 스트림을 닫고 메모리 해제

다음 코드는 방금 출력 스트림을 하면서 만들었던 data.db를 읽어내는 예제입니다.

public class Main {
    public static void main(String[] args) throws IOException {
        InputStream inputStream = new FileInputStream("test.db");

        while(true) {
            int data = inputStream.read();

            if (data == -1) {	//파일 끝에 도달하면 반복 탈출
                break;
            }
            else {
                System.out.println(data);
            }
        }
        inputStream.close();	//읽기 스트림을 닫고 메모리 해제
    }
}

조금 전에 저장한 값들이 제대로 저장되었고 잘 읽었죠?

FileInputStream 생성자는 읽고자하는 파일이 없는 경우 FileNotFoundException 예외를 발생시키며, read(), close() 메소드는 IOException을 발생시킬 수 있어서 실제로 사용할 때는 예외 처리 구문도 사용하는 것이 좋습니다.

0개의 댓글