② Object 보조 스트림 :
메모리에 생성된 객체를 파일이나 네트워크로 출력하는 걸 도와주는 스트림. 객체는 문자가 아니기 때문에 바이트 기반 스트림과 함께 사용해야 한다.
우선 객체를 바이트 스트림으로 바꿔주려면 직렬화(serialization)와 객체 역직렬화(deserialization) 개념을 알아야 한다.
- 직렬화 : 객체를 바이트 스트림으로 변환 하는 메커니즘. 객체를 출력하기 위해 객체의 데이터를 일렬로 만들어 연속적인 바이트로 변경 하는 것을 의미하며 변환하는 이유는 객체를 디스크 혹은 데이터베이스에 저장하기 위해서이다.
- 역직렬화 : 파일에 저장 되어 있거나 네트워크에서 전송 된 객체를 읽는 것을 말하는데, 입력 스트림으로부터 읽어드린 연속적인 바이트를 객체로 복원하는 것을 의미한다.
package 입출력;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
class Member implements Serializable {
String name;
String tel;
public Member(String name, String tel) {
super();
this.name = name;
this.tel = tel;
}
@Override
public String toString() {
return "Member [name=" + name + ", tel=" + tel + "]";
}
}
public class 객체보조스트림 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Member m1 = new Member("aaa", "111");
Member m2 = null; // 파일에서 읽을 객체를 저장 할 변수를 생성
String path = "src/입출력/files/data3.dat";
//저장할 경로를 표시
try {
FileOutputStream fo = new FileOutputStream(path);
ObjectOutputStream oo = new ObjectOutputStream(fo);
//ObjectOutputStream : 객체를 byte stream으로 변환
oo.writeObject(m1);
// ObjectOutputStream을 사용하여 Member 객체를 byte stream으로 변환하고,
// 이를 FileOutputStream에 쓴다.
oo.close();
fo.close();
//아래는 객체를 읽어오는 부분
FileInputStream fi = new FileInputStream(path);
ObjectInputStream oi = new ObjectInputStream(fi);
m2 = (Member) oi.readObject();
//readObject() 은 객체 한개를 읽어서 object 타입으로 반한 하는 것
//그래서 다운캐스팅이 핗요함 (Member) 이 부분
//그걸 m2 변수에 저장하고 출력
System.out.println(m2);
oi.close();
fi.close();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
- ArrayList를 사용하여 Member 객체를 3개 만들어 파일에 저장하고 파일의 모든 객체를 읽어보는 문제
package 입출력;
import java.io.EOFException;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.ArrayList;
public class 객체보조스트림문제 {
public static void main(String[] args) {
// TODO Auto-generated method stub
ArrayList<Member> list = new ArrayList<>();
list.add(new Member("aaa", "111"));
list.add(new Member("bbb", "222"));
list.add(new Member("ccc", "333"));
String path = "src/입출력스트림/files/data2.dat";
//읽고 쓸 파일의 경로를 지정
try {
ObjectOutputStream oo = new ObjectOutputStream(new FileOutputStream(path));
//객체 보조스트림을 생성 해주고 파라미터로 바이트기반 출력 스트림을 받는다
for (Member m : list) {
//지역변수 (Member m) m을 선언하고 생성 해둔 ArrayList 이름 list 요소를 순서대로 m 에 저장
oo.writeObject(m);
//ㅣist의 뽑아낸 요소를 (m)을 객체화 시켜 출력
}
oo.close();
ObjectInputStream oi = new ObjectInputStream(new FileInputStream(path));
//객체입력보조스트림 생성하고 파라미터로 바이트기반 입력 스트림을 받는다.
Member m = null;
//파일에 있는 객체를 읽어서 하니씩 변수 m 에다 저장하여 해당 저장 내용을 프린트 할 것이다.
while ((m = (Member) oi.readObject()) != null) {
//oi.readObject() 객체를 객체타입으로 읽어와 Member arrayList에 맞게
//(Member)로 형변환 시켜준후 그것을 m 에 할당해준다. 그 값이 null이 아닐 경우 까지 반복
System.out.println(m);
}
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (EOFException e) {
// TODO Auto-generated catch block
System.out.println("파일끝에 도달");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
'JAVA' 카테고리의 다른 글
[JAVA] 입출력 스트림 ④ 보조스트림 _ RandomAccess (0) | 2023.03.13 |
---|---|
[JAVA] 입출력 스트림 ④ 보조스트림 _ 바이트를 문자로 (0) | 2023.03.13 |
[JAVA] 입출력 스트림 ④ 보조스트림 _ Buffered (0) | 2023.03.13 |
[JAVA] 입출력 스트림 ③ 문자 단위 스트림 _ 입출력 (0) | 2023.03.11 |
[JAVA] 입출력 스트림 ② 바이트 단위 스트림 _ 출력 (0) | 2023.03.11 |