카테고리 없음

바이트 단위 스트림 OutputStream

자바게 2020. 4. 8. 15:29

OutputStream

바이트 단위로 스는 스트림 중 최상위 스트림입니다. 자료의 출력 대상에 따라 다른 스트림을 제공합니다.

 

스트림 클래스 설명
FlieOutputStream 바이트 단위로 파일에 자료를 씁니다.
ByteArrayOutputStream Byte 배열에 바이트 단위로 자료를 씁니다.
FilterOutputStream 기반 스트림에서 자료를 쓸 때 추가 기능을 제공하는 보조 스트림의 상위 클래스

OutputStream에서 제공하는 메소드는 다음과 같습니다.

메소드 설명
void write(int b) 한 바이트를 출력합니다.
void write(byte[ ] b) b[ ]배열에 있는 자료를 출력합니다.
void write(byte b[ ], int off, int len) b[ ]배열에 있는 자료의 off 위치부터 len 개수만큼 자료를 출력합니다.
void flush( ) 출력을 위해 잠시 자료가 머무르는 출력 버퍼를 강제로 비워 자료를 출력합니다
void close( )

출력 스트림과 연결된 대상 리소스를 닫습니다. 출력 버퍼가 비워집니다.(예: FileOutputStream인 경우 파일 닫음)

 

FileOutputStream

파일에 바이트 단위자료를 출력하기 위해 사용하는 스트림입니다. FileOutputStream을 생성하는 생성자는 다음과 같습니다.

생성자 설명
FileOutputStream(String name) 파일 이름 name(경로 포함)을 매개변수로 받아 출력 스트림을 생성합니다.

FileOutputStream(String name, boolean append)

파일 이름name(경로포함)을 매개변수로 받아 입력스트림을 생성합니다. append 값이 true이면 파일 스트림을 닫고 다시 생성할 때 파일의 끝에 이어서 씁니다. 디폴트 값은 false 입니다.

FileOutputStream(File f,) File 클래스 정보를 매개변수로 받아 출력 스트림을 생성합니다.
FileOutputStream(File f, boolean append) File 클래스 정보를 매개변수로 받아 출력 스트림을 생성합니다. append 값이 true이면 파일 스트림을 닫고 다시 생성할 때 파일의 끝에 이어서 씁니다. 디폴트 값은 false입니다.

생성자 매개변수로 전달한 파일이 경로에 없으면 FileOutputStream은 파일을 새로 생성합니다. FileOutStream을 사용해 파일에 자료를 쓸 때 기존 파일의 내용이 있더라도 처음부터 새로 쓸지(overwrite), 아니면 기존 내용 맨 뒤에 연결해서 쓸 것인지(append) 여부를 FileOutStream 생성자의 매개변수로 전달합니다. 이 값이 append 변수입니다. 스트림 생성자에서 append 값은 디폴트가 false입니다. 기존에 쓰여 있는 내용이 있더라도 새로 씁니다. 기존 파일 내용에 이어서 써야한다면 append 값을 반드시 true로 지정합니다.

 

write() 메소드 사용하기

output.txt 파일에 출력 된 결과

 

8행에서 output.txt 파일 이름으로 FileOutputsStream을 생성합니다. write() 메소드에 따라 파일에 값을 출력하고(쓰고) 스트림을 닫습니다. 

 

앞에서 실행한 FileOutputStreamTest를 한 번 더 실행하고 output.txt 파일을 살펴보면 출력 결과가 이전과 같습니다.

기존의 ABC는 없어지고 새로운 ABC가 쓰인 것입니다. 만약 기존 자료에 이어서 출력하고 싶으면 생성자의 두 번째 매개변수에 true라고 씁니다.

 

fos = new FileOutputStream("output.txt", true);

 

true 매개변수를 추가하고 실행하면 다음과 같이 어어서 쓰이는 것을 알 수 있습니다.

 

요로코롬

write(byte[ ] b) 메소드 사용하기

출력도 입력과 마찬가지로 여러 자료를 한꺼번에 출력하면 효율적일뿐더러 실행시간도 줄어듭니다. 따라서 바이트 배열을 활용하여 출력할 수 있습니다. write(byte [ ] b)메소드는 바이트 배열에 있는 자료를 한꺼번에 출력합니다.

 

9행에서 26개 크기 바이트 배열을 만듭니다. 그리고 for문을 사용하여 A~Z의 아스키 코드값을 넣어 출력할 바이트 배열을 만들었습니다. 15행의 for.write(bs)를 호출하여 전체 바이트 배열을 한꺼번에 출력합니다. output2.txt 파일을 열어 확인하면 다음과 같이 A~Z까지 출력되어 쓰여 있음을 확인할 수 있습니다.

 

마찬가지로 생성자의 두번째 매개변수에 true라고 쓰면 이미 쓰인 자료에 연결되어 출력됩니다.

 

write(byte[ ] b, int off, int len) 메소드 사용하기

write(bye[ ] b, int off, int len) 메소드는 배열의 전체 자료를 출력하지 않고 배열의 off위치부터 len 길이만큼 출력합니다. 예를 들어 앞 예제에서 만든 bs 배열을 사용한다고 할 떄 write(bs, 2, 10)이라고 쓰면 bs 배열의 두 번째 인덱스, 즉 세 번째 위치부터 10개 바이트 자료만 출력합니다. 즉 배열 자료 중 일부를 출력할 떄 사용할수 있습니다.

 

FileOutputTest2 예제에서 write() 메소드만 바꾸었습니다. 15행의 fos.write(bs, 2, 10)를 사용하여 두 번쨰 인덱스(세 번째 위치)부터 10개를 출력합니다. 출력 파일 output3.txt를 확인하면 다음과 같습니다.

 

배열에 저장된 자료 중 세 번째 위치에 있는 C부터 L까지 10개 바이트가 출력되었습니다.

 

flush() 메소드와 close() 메소드

출력 스트림에서 flush() 메소드의 기능은 강제로 자료를 출력하는 것입니다.

close() 메소드 안에서 flush() 메소드를 호출하여 출력 버퍼가 비워지면서 남아있는 자료가 모두 출력됩니다.