Binary World

JAVA CLASS : 파일 입출력(File 클래스) 02 - Serializable 본문

개발자의 길/JAVA

JAVA CLASS : 파일 입출력(File 클래스) 02 - Serializable

모쿠 2017. 1. 16. 10:23

<객체 타입 파일 입출력 : Serializable> 


* Serializable : 객체(Object) 타입을 파일에 쓰거나, 파일에서 읽어오고 싶을 때 Serializable 인터페이스를 구현하는 클래스로 선언하면 됨

* 구현해야 할 추상 메소드는 없기 때문에 implements Serializable만 추가해 주면 됨.

* 멤버 변수를 선언할 때 transient 키워드를 사용해서 선언하면, 직렬화(Serializable) 대상에서 제외 

 -> 파일 read/write 대상에서 제외


* 객체타입 입출력 단계

 프로그램 <== FileInputStream <== 파일(HDD)

 프로그램 <== ObjectInputStream <== FileInputStream <== 파일(HDD)

 프로그램 ==> ObjectOutputStream ==> BufferedOutputStream ==> FileOutputStream ==> 파일(HDD)

 Serializable 인터페이스를 구현한 클래스만 ObjectInputStream, OjectOutputStream에서 사용할 수 있음


<프로그램 코드>


Member.java (Serializable 인터페이스를 구현한 클래스)


package edu.java.file07;


import java.io.Serializable;


public class Member implements Serializable{

private /*transient*/ int no;

private String id;

private String pw;

public Member(int no, String id, String pw){

this.no = no;

this.id = id;

this.pw = pw;

}

public void displayInfo() {

System.out.println("--- 회원 정보 ---");

System.out.println("번호 : " + no);

System.out.println("아이디: " + id);

System.out.println("비밀번호: " + pw);

}

} // end class member 



1. ObjectOutputStream, BufferedOutputStream, FileOutputStream을 사용해서 ArrayList<Member> 객체를 파일에 저장


* FileMain12.java


package edu.java.file12;


import java.io.BufferedOutputStream;

import java.io.FileOutputStream;

import java.io.IOException;

import java.io.ObjectOutputStream;

import java.io.OutputStream;

import java.util.ArrayList;


import edu.java.file07.Member;


public class FileMain12 {


public static void main(String[] args) {


OutputStream out = null;

BufferedOutputStream bout = null;

ObjectOutputStream oout = null;


try {

out = new FileOutputStream("temp/list.txt");

bout = new BufferedOutputStream(out);

oout = new ObjectOutputStream(bout);

ArrayList<Member> list = new ArrayList<>();

for(int i= 0; i < 100; i++){

String id = "Memeber" + i;

String pw = "Pw" + i;

Member m = new Member(i, id, pw);

list.add(m);

} // end for

oout.writeObject(list); 

// ArrayList<> 클래스도 serializable 인터페이스를 구현하고 있기 때문에 사용 가능

System.out.println("파일 저장 성공");


} catch (Exception e) {

// TODO Auto-generated catch block

e.printStackTrace();

} finally {

try {

oout.close();

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}


}


}


} 



- FileInputStream, BufferedInputStream, ObjectInputStream을 사용해서 ArrayList<Member> 파일에서 읽음


* FileMain13.java


package edu.java.file13;


import java.io.BufferedInputStream;

import java.io.FileInputStream;

import java.io.IOException;

import java.io.InputStream;

import java.io.ObjectInputStream;

import java.util.ArrayList;


import edu.java.file07.Member;


public class FileMain13 {


public static void main(String[] args) {


InputStream in = null;

BufferedInputStream bin = null;

ObjectInputStream oin = null;


try {

in = new FileInputStream("temp/list.txt");

bin = new BufferedInputStream(in);

oin = new ObjectInputStream(bin);

ArrayList<Member> list = (ArrayList<Member>) oin.readObject();

for(Member m : list){

m.displayInfo();

}

System.out.println("파일 출력 성공");


} catch (Exception e) {

// TODO Auto-generated catch block

e.printStackTrace();

} finally {

try {

oin.close();

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}


}


} 



* 출력화면


--- 회원 정보 ---

번호 : 0

아이디: Memeber0

비밀번호: Pw0

--- 회원 정보 ---

번호 : 1

아이디: Memeber1

비밀번호: Pw1

--- 회원 정보 ---

번호 : 2

아이디: Memeber2

비밀번호: Pw2

           .

           .

           .

           .

--- 회원 정보 ---

번호 : 97

아이디: Memeber97

비밀번호: Pw97

--- 회원 정보 ---

번호 : 98

아이디: Memeber98

비밀번호: Pw98

--- 회원 정보 ---

번호 : 99

아이디: Memeber99

비밀번호: Pw99

파일 출력 성공



Comments