package com.naver.ex1;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.Vector;

// 마샬링과 언마샬링 Serialized 직렬화 
// ObejctInputStream 과 ObjectOutputStream 의 사용법
public class UseTest {

public static void writeObject(Object o, String fileName) {

// 파일을 쓰기위해서 FileOutputStream 과  FileOutputStream 을 읽을 
// ObjectOutputStream 을 생성한다.
FileOutputStream fos = null;
ObjectOutputStream oos = null;

try {
//인자로 받은 오브젝트 어떤 파일과 쓸 파일 이름을 입력받아서 온값을 가지고
// 파일네임을 fos가 입력받고, oos 는 그 fos 를 연결시켜서 
// o << 인 오브젝트객체를 oos를 이용해서 쓴다.
// 쓰고 플러시로 뿌리고, 리셋시킨다.
fos = new FileOutputStream(fileName);
oos = new ObjectOutputStream(fos);
oos.writeObject(o);
oos.flush();
oos.reset();
} catch (Exception e) {

} finally {

try {
//꼭 닫는다
if (oos != null) {
oos.close();
}
} catch (Exception e) {

}
try {
//꼭 닫는다
if (fos != null) {
fos.close();
}
} catch (Exception e) {

}
}

}

// 마샬링되어서 파일에 써진 오브젝트객체를 읽어들이기 위해서 언마샬링 한다.
public static Object readObject(String fileName) {
// 읽어들일때는 파일네임을 입력받아서 파일을 읽어 들인다
// FileInputStream 과 그것을 이용할 ObjectInputStream 을 생성한다.
FileInputStream fis = null;
ObjectInputStream ois = null;

// 읽어들일 객체가 Object 파일이기 때문에Object 파일을 하나 만들어준다.
Object o = null;

try {
// 아까 만든 fis 로 파일네임을 생성해준다
// fis 가 만들어지면 그것을 이용할 ois 로 연결시킨다.
fis = new FileInputStream(fileName);
ois = new ObjectInputStream(fis);

// 아까 만들어준 Object 파일에다가 ois 를 이용해서 파일을 읽어들인다음 쓴다.
o = ois.readObject();
} catch (Exception e) {

} finally {

try {
if (ois != null) {
ois.close();
}
} catch (Exception e) {

}
try {
if (fis != null) {
fis.close();
}
} catch (Exception e) {

}
}

return o;
}

public static void main(String[] args) {
// company, price, screenSize,inputMethod, tel,ownerName
CellPhone p1 = new CellPhone("Samsong", 5000, 2, false, "123-4567",
"마고");

CellPhone p2 = new CellPhone("LG", 15000, 4, true, "455-7847", "보리");

CellPhone p3 = new CellPhone("Apple", 50000, 5, true, "677-4656", "나");

// writeObject(p2,"object.dat");
// writeObject(p2,"object.dat");

// 오브젝트 객체는 한파일에 한번밖에 못쓰기 때문에
// 딱 한번만 저장해야 한다. 그렇기때문에 쓸 모든 객체들을 
// 벡터에 우겨넣어서 하나의 객체로 만든다.
// 생성해놓은 CellPhone 객체를 벡터에 담는다. 
  Vector vec = new Vector(); 
  vec.add(p1); 
  vec.add(p2); 
  vec.add(p3);
 

// 벡터에 쎌폰 객체도 담고 그것들을 담은 벡터도 걍 담아버린다.
  Vector subVec = new Vector(); 
  subVec.add(p1); 
  subVec.add(p2);
  subVec.add(p3); 
  subVec.add(vec);
 

  // 대망의 쓰기다 . 아까만들어놓은 메소드에 subVec 을 파일네임에 쓴다.
 writeObject(subVec,"object.dat");

 
 
 
 // 읽어 들여서 쓰는 부분을 구현하는 코드
Vector temp = null;

// 파일을 읽어들이는 부분이다. 리드오브젝트 메소드로  파일이름을 
// 써주고 오브젝트를 읽는다.
Object o = readObject("object.dat");

if (o instanceof Vector) {
temp = (Vector) o; // 꺼낼려는 객체가 벡터형식이 맍으면 temp 에 집어넣는다. 아니면 에러
}

if (temp != null) {
CellPhone cell = null; // 꺼낼 객체가 CellPhone 이기 때문에 생성
cell = (CellPhone) temp.get(0); // 하나 꺼내서  읽어본다.
//System.out.println(cell.getCompany());

for (Object obj : temp) {// 꺼낸 temp 가 오브젝트니까 반복문 돌려서
if (obj instanceof CellPhone) {// 꺼낸게 CellPhone 이면 바로출력하고
System.out.println(obj);
System.out.println("쎌폰 안");
} else if (obj instanceof Vector) { //꺼낸게 벡터면 다시 그벡터를 CellPhone 으로 뽑는다.
System.out.println("벡터 안");
Vector subVec2 = (Vector) obj;
for (Object p : subVec2) {
System.out.println(p);
System.out.println("벡터 안");
}
}
}

} else {
System.out.println("예상밖의 결과 발생 !");
}
}

}

YOUR COMMENT IS THE CRITICAL SUCCESS FACTOR FOR THE QUALITY OF BLOG POST