자바 Stream과 OutputStream

이동영·2024년 3월 26일

자바 개념정리

목록 보기
21/21

데이터는 키보드를 통해 입력이 되거나 특정 프로그램 파일에 의해서 데이터가 입력이 될 수 있다. 또한 이러한 데이터를 모니터로 출력이 되는데 이것을 데이터 입출력이라고 하며 자바에서는 이러한 입출력을 입력 스트릠, 출력 스트림을 통하여 입출력을 할 수 있다.

스트림은 단방향으로 흐르는 것을 말한다. 키보드에서 출발하면 도착지로는 모니터 등이 있다.

프로그램을 기준으로 데이터가 들어오면 입력스트림, 프로그램을 기준으로 데이터가 나가면 출력스트림이며 프로그램 끼리 데이터가 교환 되려면 양쪽 모두 입출력이 되어야 한다.

어떤 데이터를 입출력 하는지에 따라 2가지의 종류로 구분할 수 있다.

  • 바이트 스트림 : 그림, 멀티미디어, 문자 등 모든 데이터 입출력시 사용
  • 문자 스트림 : 문자만 가능

ByteStream

바이트 스트림의 최상위 클래스로는 입출력 각각 InputStream, OutputStream의 추상클래스가 있으며 이 스트림을 사용하기 위해 구현된 구현체를 사용해야 한다. 구현체는 접미사로 InputStream OutputSream이 붙어야 하며 예를들어 파일을 사용하는 스트림은 경우 FileInputSream등과 같이 이름을 사용할 수 있다.

또한 문자 입출력 스트림 같은 경우 접미사로 Reader가 있으며 추상클래스형태이다. 마찬가지로 이를 사용하기 위해 구현된 구현체를 사용해야 하며 텍스트 파일을 입출력 하는 FileReader등이 있다.

바이트 출력 스트림


모든 OutputStream은 최상위 클래스로 OutputStream을 가지고 있으며 이를 상속 받아 사용한다.

Byte출력

write(int b)타입의 메소드를 제공하며 이는 byte를 출력하는 메소드 이다. int타입의 매개변수로 받은 데이터는 4byte중 맨 끝인 1byte만 출력하게 된다.
즉 int타입으로 매개변수를 받지만 4byte를 전부 받는것이 아닌 끝의 1byte만 받아서 출력한다.

public class C01OutputStream {
    public static void main(String[] args) throws IOException {
        String fileName = "temp/output01.data";
        OutputStream os = new FileOutputStream(fileName);
        os.write(99);
        os.write(100);
        os.write(1000000000);
    }
}

OutputStream은 내부에 버퍼라는 공간이 존재하며 내부 버퍼에 바이트를 우선 저장하고 버퍼가 차게되면 순서대로 byte를 출력하게 된다. 버퍼에 얼마나 있는지 상관없이 그냥 전부 출력 방출을 시키고 싶을 경우 flush()를 호출하면 된다.

close()를 해줘야 하는 이유

책에는 이론적으로 출력 스트릠을 닫아 사용한 메모리를 해제라고만 적혀있다. 이 말이 표면적으로 보이지 않아 무슨 말인지 이해가 되지 않을 수 있다. 간단히 설명하자면 OutputStream으로 생성된 파일을 삭제하려고 하는데 갚자기 다른 프로그램에서 참조중으로 삭제할 수 없다고 나온다.
이는 바로 OutputSream에서 메모리를 아직 사용하고 있기 때문이다. 그렇기 때문에 사용이 끝난 OutputStream은 꼭 close()호출하여 메모리를 해제해주는것이 좋다.

profile
가치를 제공하는 개발자

0개의 댓글