2021-02-25
- 정의
모든 출력 스트림의 최상위 클래스로 모든 바이트 기반의 입력 스트림은 OutputStream을 상속받아 사용한다. 자바 API에서의 정의는 아래와 같다.
This abstract class is the superclass of all classes representing an output stream of bytes. An output stream accepts output bytes and sends them to some sink. Applications that need to define a subclass of OutputStream must always provide at least a method that writes one byte of output.
이 추상 클래스는 바이트의 출력 스트림을 나타내는 모든 클래스의 슈퍼 클래스입니다. 출력 스트림은 출력 바이트를 받아 일부 싱크로 보냅니다. OutputStream의 서브 클래스를 정의해야하는 애플리케이션은 항상 1 바이트의 출력을 작성하는 메서드를 제공해야 합니다.
( 출처 : 자바 API )
- 선언
InputStream과 마찬가지로 추상클래스이기 때문에 new 연산자로 객체를 생성할 수 없으며, 자식 클래스를 받거나 또는 System.out; 을 받아 객체로 활용할 수 있다.
package tOutputStream;
import java.io.IOException;
import java.io.OutputStream;
public class Main {
public static void main(String[] args) {
OutputStream os = System.out;
// public abstract class OutputStream
// extends Object
// implements Closeable, Flushable
// 자바 API 상에도 나와 있듯이 추상 클래스
// 이기 때문에 자체적으로 new 연산자를 사용할 수 없다.
// new 연산자의 사용을 원할 경우 자식클래스를 받으면 된다.
}
}
- write ( )
write는 출력스트림의 출력을 담당하는 메서드로 매개 값으로 byte형 배열을 받는다. 때문에 예제로 사용할 바이트 배열에 각각 데이터를 입력해서 넣어주었다. ( int 형 변수도 받을 수 있는데, 이는 매개값으로 온 int형 변수 끝 1바이트만 출력 스트림으로 보낸다.)
package tOutputStream;
import java.io.IOException;
import java.io.OutputStream;
public class Main {
public static void main(String[] args) {
OutputStream os = System.out;
// public abstract class OutputStream
// extends Object
// implements Closeable, Flushable
// 자바 API 상에도 나와 있듯이 추상 클래스
// 이기 때문에 자체적으로 new 연산자를 사용할 수 없다.
// new 연산자의 사용을 원할 경우 자식클래스를 받으면 된다.
byte[] checkByte = new byte [10];
checkByte[0] = 'K';
checkByte[1] = 'I';
checkByte[2] = 'N';
checkByte[3] = 'G';
checkByte[4] = '!';
// 입력된 "KING!" 를 writer를 사용해 콘솔해 출력해 보겠다.
System.out.println("------------------------------------------------");
System.out.println("== 버퍼에 저장되어 있던 데이터가 출력됩니다. == ");
try {
os.write(checkByte);
// write를 이용해 입력된 데이터를 출력
os.flush();
// 버퍼에 잔류하는 모든 데이터를 출력하는 메소드
// write 사용시 반드시 사용해야 한다.
// 버퍼를 비우지 않으면 차후 출력문 실행시
// 원하지 않는 데이터와 함께 출력될 수 있기 때문이다.
os.close();
// 출력이 완료되었기 때문에 OutputStream을 닫아준다.
// 이로써 자원을 풀어주는 기능을 하게 된다.
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
write 메소드 역시 IOException을 동반할 수 있어 try / catch 구문으로 담아주어야 컴파일에서 오류 없이 실행이 가능하다.
- flush / close
다만 출력을 끝낸 후에는 반드시 flush라는 메소드를 사용해야 하는데, 이는 출력 후 버퍼에 남아있을 수 있는 잔류 데이터들을 모두 내보내는 동작을 수행해 준다. 주석에도 적어두었지만, flush를 통해 잔류 버퍼를 내보내 주지 않으면, 차후 출력문 실행 시 원치 않은 데이터와 함께 출력될 수 있기 때문이다.
모든 동작이 끝나면 OutputStream을 close 메소드로 닫아주고 프로그램이 종료된다.