java.io.ObjectOutputStream

- ObjectOutputStream 클래스는 객체들을 출력하는 기능을 제공하는 클래스로 출력 스트림에 출력하기 전에 직렬화를 수행한다.

- 파일이나 네트워크로 데이터를 전송하기 위해 직렬화를 수행하며, 이때 writeObject() 메소드를 사용하여 변환한다.

- 스트림에 저장할 수 있는 객체는 Serializable 인터페이스를 구현한 클래스의 객체만 가능하다.

import java.io.FileOutputStream;
import java.io.ObjectOutputStream;
import java.util.Hashtable;

public class Ex001_ObjectOutputStream {

	public static void main(String[] args) {
		Hashtable<String, String> ht = new Hashtable<String, String>();
		
		ht.put("자바", "프로그래밍");
		ht.put("HTML", "웹 프로그래밍");
		ht.put("오라클", "데이터베이스");
		
		String pathname = "object.txt";
		ObjectOutputStream oos = null;
		
		try {
			// ObjectOutputStream : 객체를 저장 할 수 있는 스트림
			// 객체를 저장하면 파일 선두에는 객체의 클래스명이 저장된다.
			oos = new ObjectOutputStream(new FileOutputStream(pathname));
			oos.writeObject(ht);
			System.out.println("파일 저장 완료...");
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			if(oos !=null ) {
				try {
					oos.close();
				} catch (Exception e2) {
				}
			}
		}
		
	}

}

 

위 코드를 실행하면 object.txt 파일이 저장되고 안에는 이렇게 되어있다.


java.io.ObjectInputStream

- ObjectOutputStream 클래스에 의해 파일에 저장되거나 네트워크를 통해 전달된 객체의 직렬화를 해제하는 기능을 제공한다.

- 파일이나 네트워크를 통해 받은 직렬화된 데이터를 다시 원래 데이터로 복원하는 역할을 하며, 이때 readObject() 메소드를 사용하여 복원한다.

- readObject() 메소드를 통해 읽어 들인 데이터는 원래 데이터로 캐스팅하여 사용한다.

- 스트림으로부터 읽어들일 수 있는 객체는 Serializable 인터페이스나 Externalizable 인터페이스를 구현한 클래스의 객체만 가능하다.

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.util.Hashtable;
import java.util.Iterator;

public class Ex002_ObjectInputStream {

	public static void main(String[] args) {
		String pathname = "object.txt";
		
		try ( ObjectInputStream ois = new ObjectInputStream(new FileInputStream(pathname))){
			// 제너릭은 다운 캐스팅하면 경고가 나옴.
			@SuppressWarnings("unchecked") // 경고없앰
			Hashtable<String, String> ht = (Hashtable<String, String>)ois.readObject();
			
			Iterator<String> it = ht.keySet().iterator();
			while(it.hasNext()) {
				String key = it.next();
				String value = ht.get(key);
				System.out.println(key+" -> "+value);
			}
			
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} catch (Exception e) {
			e.printStackTrace();
		}

	}

}

위에서 만든 object.txt파일을 읽어들인 결과

Hashtable 은 Map의 구현 클래스로 동기화를 지원한다.

Map은 <키, 값>의 구조로 키는 중복을 허용하지 않는다. 키는 순서가 없으므로 반복자도 존재하지 않는다.

+ Recent posts