반응형

객체 스트림을 사용하기 위해서 우선 객체 파일을 생성합니다.

package chap15.sec02.exam06;

import java.io.Serializable;
import java.util.Date;
import java.util.Objects;

/**
 * packageName : chap14.sec02.exam06
 * fileName : Board
 * author : ds
 * date : 2022-10-07
 * description : 게시판 객체
 * ===========================================================
 * DATE            AUTHOR             NOTE
 * —————————————————————————————
 * 2022-10-07         ds          최초 생성
 */
// 모델(Model) : 순수객체, 속성, 생성자, Setter/Getter, 그외에 로직을 구하는 함수는 없음
//    목적 : 데이터 저장용/검색용
// Service : 업무가 들어가 있는 클래스(객체)
// Controller : 여러 화면을(View) 조작하는(컨트롤하는) 클래스
//    MVC 디자인패턴(종합편) : M(Model) / V(View) / C(Controller)
public class Board implements Serializable {
//    속성
//    게시판 번호
    private int bno;
//    제목
    private String title;
//    내용
    private String content;
//    작성자
    private String writer;
//    날짜
    private Date date;

//    생성자
    public Board(int bno, String title, String content, String writer, Date date) {
        this.bno = bno;
        this.title = title;
        this.content = content;
        this.writer = writer;
        this.date = date;
    }

//    함수 재정의
    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Board board = (Board) o;
        return bno == board.bno && Objects.equals(title, board.title) && Objects.equals(content, board.content) && Objects.equals(writer, board.writer) && Objects.equals(date, board.date);
    }

    @Override
    public int hashCode() {
        return Objects.hash(bno, title, content, writer, date);
    }

    @Override
    public String toString() {
        return "Board{" +
                "bno=" + bno +
                ", title='" + title + '\'' +
                ", content='" + content + '\'' +
                ", writer='" + writer + '\'' +
                ", date=" + date +
                '}';
    }
}

Serializable (직렬화)

 Object 또는 Data를 다른 컴퓨터의 자바 시스템에서도 사용 할수 있도록 바이트 스트림(stream of bytes) 형태로 연속전인(serial) 데이터로 변환하는 포맷 변환 기술을 일컫는다. 그 반대 개념인 역직렬화는(Deserialize)는 바이트로 변환된 데이터를 원래대로 자바 시스템의 Object 또는 Data로 변환하는 기술이다.

객체 클래스(위에서는 Borad)에 Serializable 을 상속받으면 가능

public class ObjectApplication {
    //    객체 쓰기 공유 함수
    public static void writeList() throws Exception {
//        자료구조 : ArrayList
        List<Board> list = new ArrayList<>(); // List 생성 (ArrayList)

        list.add(new Board(1, "제목1", "내용1", "글쓴이1", new Date()));
        list.add(new Board(2, "제목2", "내용2", "글쓴이2", new Date()));
        list.add(new Board(3, "제목3", "내용3", "글쓴이3", new Date()));

//        TODO: 객체를 파일에 쓰기(파일 생성)
        FileOutputStream fileOutputStream
                = new FileOutputStream("src/main/resources/board.txt");
//        TODO : 보조스트림 적용(객체 쓰기)
//              .writeObject(객체배열)
        ObjectOutputStream objectOutputStream
                = new ObjectOutputStream(fileOutputStream);

        objectOutputStream.writeObject(list);   // 객체 -> 파일 쓰기 함수 호출
        objectOutputStream.flush();
        objectOutputStream.close();

    }

    //    객체 읽기 공유 함수
    public static List<Board> readList() throws Exception {
//        TODO: 파일 읽기로 접근
        FileInputStream fileInputStream
                = new FileInputStream("src/main/resources/board.txt");

//        TODO : 보조스트림 적용 : 파일 -> 객체 읽기
        ObjectInputStream objectInputStream
                = new ObjectInputStream(fileInputStream);

//        TODO : 파일 -> 객체배열로 원복해서 읽기 : .readObject()
//            대상 객체[배열]은 Serializable 인터페이스를 상속받아야 함
        List<Board> list = (List<Board>)objectInputStream.readObject(); // 객체로 바꾸기(원복)
        return list;
    }

    public static void main(String[] args) throws Exception{
        writeList(); // 쓰기 공유 함수 객체배열 List 파일에 쓰기
//        파일에 쓴 것을 읽기
        List<Board> list = readList(); // 읽기 공유 함수(역직렬화)

        System.out.println(list);
    }
}

 

객체 쓰기 공유 함수

 //    객체 쓰기 공유 함수
    public static void writeList() throws Exception {
//        자료구조 : ArrayList
        List<Board> list = new ArrayList<>(); // List 생성 (ArrayList)

        list.add(new Board(1, "제목1", "내용1", "글쓴이1", new Date()));
        list.add(new Board(2, "제목2", "내용2", "글쓴이2", new Date()));
        list.add(new Board(3, "제목3", "내용3", "글쓴이3", new Date()));

//        TODO: 객체를 파일에 쓰기(파일 생성)
        FileOutputStream fileOutputStream
                = new FileOutputStream("src/main/resources/board.txt");
//        TODO : 보조스트림 적용(객체 쓰기)
//              .writeObject(객체배열)
        ObjectOutputStream objectOutputStream
                = new ObjectOutputStream(fileOutputStream);

        objectOutputStream.writeObject(list);   // 객체 -> 파일 쓰기 함수 호출
        objectOutputStream.flush();
        objectOutputStream.close();

    }

 

객체 읽기 공유 함수

//    객체 읽기 공유 함수
    public static List<Board> readList() throws Exception {
//        TODO: 파일 읽기로 접근
        FileInputStream fileInputStream
                = new FileInputStream("src/main/resources/board.txt");

//        TODO : 보조스트림 적용 : 파일 -> 객체 읽기
        ObjectInputStream objectInputStream
                = new ObjectInputStream(fileInputStream);

//        TODO : 파일 -> 객체배열로 원복해서 읽기 : .readObject()
//            대상 객체[배열]은 Serializable 인터페이스를 상속받아야 함
        List<Board> list = (List<Board>)objectInputStream.readObject(); // 객체로 바꾸기(원복)
        return list;
    }

 

메인 함수

 public static void main(String[] args) throws Exception{
        writeList(); // 쓰기 공유 함수 객체배열 List 파일에 쓰기
//        파일에 쓴 것을 읽기
        List<Board> list = readList(); // 읽기 공유 함수(역직렬화)

        System.out.println(list);
    }
}
반응형

+ Recent posts