보조 스트림(=필터스프림) 이란 다른 스트림과 연결되어 여러 가지 편리한 기능을 제공해주는 스트림을 말한다.
보조 스트림은 자체적으로 입출력을 수행할 수 없기 때문에 입출력 소스로부터 직접 생성된 입출력 스트림에 연결해서 사용해야 한다.
cf) 입력스트림(노드스트림) - 직접 자원을 만남
ex) a.txt → FileInputStream 입력스트림(노드스트림) → 이걸 가공해서 DataInputStream 보조스트림
DataOutputStream → FileInputStream → b.txt
// 바이트 입력 스트림인 FileInputStream에 InputStreamReader 보조 스트림 연결
// InputStreamReader 바이트 스트림을 문자 스트림으로 변환
// 가공해서 String으로 씀
InputStream is = new FileInputStream("...");
InputStreamReader reader = new InputStreamReader(is);
보조 스트림은 또 다른 보조 스트림과 연결되어 스트림 체인으로 구성할 수 있다.
// 문자 변환 보조스트림인 InputStreamReader에 BufferedReader 보조 스트림을 연결
InputStream is = new FileInputStream("...");
InputStreamReader reader = new InputStreamReader(is);
BufferedReader br = new BufferedReader(reader);
FileOutputStream fos = new FileOutputStream("a.ser"); // a.ser 파일
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(new Date()); // 객체직렬화 → 이걸 도와주는게 writeObject메서드
※ 객체 스트림
객체단위로 쓴다 = 객체를 얼린다, readObject, writeObject 대표 메서드
자바는 메모리에 생성된 객체를 파일 또는 네트워크로 출력할 수 있다. 객체를 출력하려면 필드값을 일렬로 늘어선 바이트로 변경해야 하는데, 이것을 직렬화(serialization)라고 한다. 반대로 직렬화된 바이트를 객체의 필드값으로 복원하는 것을 역직렬화(deserialization)라고 한다.
ObjectInputStream과 ObjectOutputStream은 객체를 입출력할 수 있는 보조 스트림이다.
ObjectOutputStream은 바이트 출력 스트림과 연결되어 객체를 직렬화하고,
ObjectInputStream은 바이트 입력 스트림과 연결되어 객체로 복원하는 역직렬화를 한다.
바이트→InputStream→ObjectInputStream→프로그램/객체→ObjectOutputStream→OutputStream→바이트
※ 직렬화하려면 Serializable interface 구현한 파일만 가능하고 역직렬화도 직렬화된 파일만 가능
객체복제 : Cloneable interface 구현
직렬화 : Serializable interface 구현
- JDK 버전이 다르면 역직렬화 못해온다.
- 객체역직렬화를 통해 리플렉션, 직렬화에서 사용된 클래스가 역직렬화에서 사용되어야 한다.
- 첫번째 얼려진값이 첫번째 멤버변수값, 두번째 얼려진값이 두번째 멤버변수값 ....
- transient 예약어를 쓰면 그 멤버변수의 직렬화 제외
'언어 > Java' 카테고리의 다른 글
Product 예제 4 (0) | 2023.08.09 |
---|---|
필터스트림, 직렬화 예시 (0) | 2023.08.09 |
메타클래스, File 정보 가져오기 (0) | 2023.08.09 |
FileCopy 예제 (0) | 2023.08.09 |
입출력 스트림 예시 (0) | 2023.08.09 |