바이트 단위 스트림
- OutputStream
바이트 단위로 쓰는 스트림 중 최상위 스트림이다. 자료의 출력 대상에 따라 다른 스트림을 제공한다.
FIleOutputStream - 바이트 단위로 파일에 자료를 쓴다.
ByteArrayOutputStream - 바이트 배열에 바이트 단위로 자료를 쓴다
FilterOutputStream - 기반 스트림에서 자료를 쓸 때 추가 기능을 제공하는 '보조 스트림'의 상위 클래스이다.
사용하는 대표 메서드로는 write() 메서드가 있다. 반환값은 void다.
출력버퍼를 강제로 비워 자료를 출력하는 flush()버퍼와 출력 스트림과 연결된 대상 리소스를 닫는 close() 메서드도 있다.
FileOutputStream
파일에 바이트 단위의 자료를 출력하기 위햐 가장 많이 사용하는 스트림이다.
위에 있는 생성자 말고도 File f, 클래스 정보를 매개변수로 받아 출력 스트림을 생성하는 생성자도 있다.
FileOutputStream을 사용하여 자료를 쓸 때 기존의 파일 내용이 있다고 해도 처음부터 새로 쓸 것인지 - overwrite
아니면 기존 내용의 맨 뒤에 연결하여 쓸 것인지 append 여부를 생성자의 매개변수로 전달한다. append의 디폴트 값은 false이다. 기존에 쓰인 내용이 있어도 새로 쓴다. 그러므로 이어서 쓰려면 반드시! true로 값을 바꾸어야한다.
이제 클래스를 이용하여 파일에 정수값을 저장해보자.
package stream;
import java.io.FileOutputStream;
import java.io.IOException;
public class FileOutputStreamTest1 {
public static void main(String[] args) {
try(FileOutputStream fos = new FileOutputStream("output.txt")) {
fos.write(65);
fos.write(66); // FileOutputStream은 파일에 숫자를 쓰면 해당하는 아스키 코드 값으로 변환된다.
fos.write(67);
} catch (IOException e) {
e.printStackTrace();
}
System.out.println("출력이 완료되었습니다.");
}
}
위 코드를 실행시켜보면 파일이 생성된다!
생성된 파일을 열어보면 ABC라고 쓰여있다. 잘 실행되었음을 알 수 있다.
위 생성자에 true 매개변수를 추가하고 실행하면 이어서 쓰이는 것을 확인할 수 있다.
출력도 입력과 마찬가지로 여러 자료를 한 번에 출력하면 훨씬 효율적이다. 이럴 경우 사용하는 것이
write(byte[] b) 메서드
바이트 배열에 있는 자료를 한꺼번에 출력한다.
package stream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
public class FileOutputStreamTest2 {
public static void main(String[] args) throws FileNotFoundException {
FileOutputStream fos = new FileOutputStream("output2.txt", true); {
try(fos){
byte[] bs = new byte[26];
byte data = 65;
for(int i = 0; i <bs.length; i++) {
bs[i] = data;
data++;
}
fos.write(bs);
} catch (IOException e) {
e.printStackTrace();
}
System.out.println("출력이 완료되었습니다.");
}
}
}
생성된 파일을 열어 확인하면 A~Z 까지 출력되어 쓰인 것을 확인할 수 있다.
write(byte[] b, int off, int len) 메서드
배열의 전체 자료를 출력하지 않고, 배열의 off 위치부터 len 길이만큼 출력한다.
flush() 메서드
강제로 자료를 출력하는 메서드이다.
write()메서드로 값을 썼다고 해도 파일이나 네트워크로 전송되지 않고 출력을 위한 자료가 쌓이는 출력 버퍼에 어느 정도 자료가 모여야 출력된다. 따라서 자료의 양이 출력할 만큼 많지 않으면 write () 메서드로 출력했어도 파일에 쓰이지 않거나 전송되지 않을 수 있다. 이런 경우 flush 메서드를 호출한다. 출력스트림의 close메서드 안에서 flush() 메서드를 호출하여 버퍼가 지워지면서 남아 있는 자료가 모두 출력된다.
- 바로바로 전송해야하는 채팅 메세지 같은 경우 flush 메서드를 호출하는 것이 좋다.
'공부 STUDY > JAVA' 카테고리의 다른 글
[JAVA] 보조 스트림(Wrapper 스트림)에 대해 알아보자 |FIilterInputStream, FilterOutputStream (0) | 2023.01.24 |
---|---|
[JAVA] 자바 입출력과 스트림 - (4) | 문자 단위 스트림 (0) | 2023.01.24 |
[JAVA] 자바 입출력과 스트림 - (2) | 바이트 단위 스트림 - InputStream (0) | 2023.01.24 |
[JAVA] 자바 입출력과 스트림 - (1) | scanner 클래스와 Console 클래스에대해 알아보자 (0) | 2023.01.23 |
[JAVA] 사용자 정의 예외 클래스 구현하기 | 아이디 설정 조건에서 예외 발생에대한 클래스를 구현해보자! | 사용자 정의 예외 (0) | 2023.01.23 |