본문 바로가기

언어/Java

필터스트림, 객체직렬화

보조 스트림(=필터스프림) 이란 다른 스트림과 연결되어 여러 가지 편리한 기능을 제공해주는 스트림을 말한다.

보조 스트림은 자체적으로 입출력을 수행할 수 없기 때문에 입출력 소스로부터 직접 생성된 입출력 스트림에 연결해서 사용해야 한다.

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);

객체직렬화. JVM은 휘발되고 파일은 남아있음, 객체의 자료형 정보. 객체의 멤버변수들 순서대로 채워짐. 일렬로 나열화

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→바이트

객체역직렬화, readObject()메서드가 아래 123 해줌

※ 직렬화하려면 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