자바기초) File 활용 퀴즈 : 연락처 프로그램 4

박대현·2023년 2월 10일
0

자바 기초 활용

목록 보기
19/22

연락처 프로그램 3을 수정하여 File에 연락처 명부를 저장하도록 하여라.


조건

  1. 데이터를 저장할 폴더는 data
    파일 이름은 contact.data이다.

  2. initDataDir() 메소드
    ata 폴더가 있는지 검사하고, 없으면 생성하는 함수

  3. initDataFile() 메소드
    데이터 파일이 존재하는지 검사하고,
    없는 경우 - 새로운 데이터 파일 생성
    있는 경우 - 기존 파일에서 데이터를 읽어서 ArrayList에 추가

  4. writeDataToFile() 메소드
    멤버 변수 list 객체를 data\contact.data 파일에 저장(쓰기)

  5. readDataFromFile() 메소드
    data\contact.data 파일에서 ArrayList 객체를 읽어와서
    멤버 변수 list에 저장(읽기)


ContactDAOImple 클래스(변경된 코드)

package edu.java.contact04;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.EOFException;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
import java.util.ArrayList;

public class ContactDAOImple implements ContactDAO {

	private static ContactDAOImple instance = null;

	private ContactDAOImple() { // 싱글톤 객체 초기화 시 바로 파일 존재 확인
		initDataDir(); //폴더 확인
		initDataFile(); //파일 확인
	}

	public static ContactDAOImple getInstance() {
		if (instance == null) {
			instance = new ContactDAOImple();
		}
		return instance;
	}

	private ArrayList<ContactVO> list = new ArrayList<>(); // 연락처 저장 장소
	
    //1. 데이터를 저장할 폴더는 data 파일 이름은 contact.data이다.
	
    // 데이터를 저장할 폴더와 파일 이름 정의
	private static final String DATA_DIR = "data";
	private static final String DATA_FILE = "contact.data";

	// data 폴더의 contact.data 파일을 관리할 File 객체 선언
	private File dataDir;
	private File dataFile;

	// 2. data 폴더가 있는지 검사하고, 없으면 생성하는 함수
	private void initDataDir() {
		System.out.println("initDataDir()");
		dataDir = new File(DATA_DIR);
		System.out.println("폴더 경로 : " + dataDir.getPath());
		System.out.println("절대 경로 : " + dataDir.getAbsolutePath());
		if (!dataDir.exists()) { // 폴더가 없으면
			System.out.println("폴더가 생성되지 않았습니다.");
			if (dataDir.mkdirs()) {
				System.out.println("폴더 생성 성공");
			} else {
				System.out.println("폴더 생성 실패");
			}
		} else {
			System.out.println("폴더가 이미 존재");
		}
	} // end initDataDir()

	// 3. 데이터 파일이 존재하는지 검사하고,
	// 없는 경우 - 새로운 데이터 파일 생성
	// 있는 경우 - 기존 파일에서 데이터를 읽어서 ArrayList에 추가
	private void initDataFile() {
		dataFile = new File(DATA_DIR + File.separator + DATA_FILE);
		System.out.println("파일 경로 : " + dataFile.getPath());
		System.out.println("절대 경로 : " + dataFile.getAbsolutePath());
		if (!dataFile.exists()) { // 파일이 없을 때
			System.out.println("파일이 생성되지 않았습니다.");
			try {
				if (dataFile.createNewFile()) {
					System.out.println("파일 생성 성공");
				} else {
					System.out.println("파일 생성 실패");
				}
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		} else { // 파일이 있을 때
			System.out.println(list.size());
//			if (list.size() != 0) {
			if (dataFile.length()!=0) { // 파일에 저장된 데이터가 있는 경우
				readDataFromFile(); //파일에서 데이터를 읽어 옴
			}
			System.out.println("파일이 이미 존재 합니다.");
		}
	}

	OutputStream out = null;
	BufferedOutputStream bout = null;
	ObjectOutputStream oout = null;

	// 4. 멤버 변수 list 객체를 data\contact.data 파일에 저장(쓰기)
	private void writeDataToFile() {
		try {
			out = new FileOutputStream(DATA_DIR + File.separator + DATA_FILE);
			bout = new BufferedOutputStream(out);
			oout = new ObjectOutputStream(bout);
			oout.writeObject(list);
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			try {
				oout.close();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	} // end writeDataToFile()

	// 5.data\contact.data 파일에서 ArrayList 객체를 읽어와서
	// 멤버 변수 list에 저장(읽기)
	InputStream in = null;
	BufferedInputStream bin = null;
	ObjectInputStream oin = null;

	private void readDataFromFile() {
		try {
			in = new FileInputStream(DATA_DIR + File.separator + DATA_FILE);
			bin = new BufferedInputStream(in);
			oin = new ObjectInputStream(bin);
			list = (ArrayList<ContactVO>) oin.readObject();
		} 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();
		} finally {
			try {
				oin.close();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	} // end readDataFromFile()

	public int getListSize() {
		return list.size();
	}

	@Override
	public int insert(ContactVO vo) {
		list.add(vo);
		writeDataToFile();
		return 1; // 0 : 실패, 1 : 성공
	}

	@Override
	public ArrayList<ContactVO> select() {
		readDataFromFile();
		return list;
	}

	@Override
	public ContactVO select(int index) {
		readDataFromFile();
		return list.get(index);
	}

	@Override
	public int update(int index, ContactVO vo) {
		// list.set(index, new ContactVO(vo.getName(), vo.getPhone(), vo.getEmail()));
		list.get(index).setEmail(vo.getEmail());
		list.get(index).setName(vo.getName());
		list.get(index).setPhone(vo.getPhone());
		writeDataToFile();
		return 1;
	}

	@Override
	public int delete(int index) {
		list.remove(index);
		writeDataToFile();
		return 1;
	}

}

ContactVO(변경된 코드)

package edu.java.contact04;

import java.io.Serializable;

public class ContactVO implements Serializable { //직렬화
	private String name;
	private String phone;
	private String email;

	public ContactVO() {

	}

	public ContactVO(String name, String phone, String email) {
		this.name = name;
		this.phone = phone;
		this.email = email;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getPhone() {
		return phone;
	}

	public void setPhone(String phone) {
		this.phone = phone;
	}

	public String getEmail() {
		return email;
	}

	public void setEmail(String email) {
		this.email = email;
	}

	@Override
	public String toString() {
		return "ContactVO [name=" + name + ", phone=" + phone + ", email=" + email + "]";
	}

}

Menu 인터페이스

public interface Menu {
	public static final int INSERT = 1;
	public static final int SELECT_ALL = 2;
	public static final int SELECT_BY_INDEX = 3;
	public static final int UPDATE = 4;
	public static final int DELETE = 5;
	public static final int EXIT = 0;
}

ContactDAO 인터페이스

import java.util.ArrayList;

public interface ContactDAO {
	public abstract int insert(ContactVO vo);

	public abstract ArrayList<ContactVO> select();

	public abstract ContactVO select(int index);

	public abstract int update(int index, ContactVO vo);
	
	public abstract int delete(int index);
}

Main 클래스

package edu.java.contact04;

import java.util.ArrayList;
import java.util.Scanner;

public class ContactMain04 {
	private static Scanner sc;
	private static ContactDAO dao;

	public static void main(String[] args) {
		System.out.println("연락처 관리 프로그램");
		sc = new Scanner(System.in);
		dao = ContactDAOImple.getInstance();
		boolean run = true;
		while (run) {
			showMainMenu();
			int sel = sc.nextInt();
			switch (sel) {
			case Menu.INSERT:
				insert();
				break;
			case Menu.SELECT_ALL:
				selectall();
				break;
			case Menu.SELECT_BY_INDEX:
				selectbyindex();
				break;
			case Menu.UPDATE:
				update();
				break;
			case Menu.DELETE:
				delete();
				break;
			case Menu.EXIT:
				run = false;
				break;
			default:
				System.out.println("다시 입력 하세요.");
				break;
			}
		}

	}

	private static void insert() {
		System.out.println("연락처 등록");
		System.out.println("이름:");
		String name = sc.next();
		System.out.println("휴대폰번호:");
		String phone = sc.next();
		System.out.println("이메일:");
		String email = sc.next();
		ContactVO vo = new ContactVO(name, phone, email);
		int result = dao.insert(vo);
		if (result == 1) {
			System.out.println("연락처가 정상 등록 되었습니다.");
		}

	}

	private static void selectall() {
		ArrayList<ContactVO> list = dao.select();
		System.out.println("연락처 리스트 출력");
		for (ContactVO vo : list) {
			System.out.println(vo);
		}

	}

	private static void selectbyindex() {
		System.out.println("연락처 인덱스 입력 ");
		int index = sc.nextInt();
		if (index >= 0 && index < ((ContactDAOImple) dao).getListSize()) {
			ContactVO vo = dao.select(index);
			System.out.println(vo);
		}

	}

	private static void update() {
		System.out.println("연락처 정보 수정 ");
		System.out.println("연락처 인덱스 입력 ");
		int index = sc.nextInt();
		if (index >= 0 && index < ((ContactDAOImple) dao).getListSize()) {
			System.out.println("이름:");
			String name = sc.next();
			System.out.println("휴대폰번호:");
			String phone = sc.next();
			System.out.println("이메일:");
			String email = sc.next();
			ContactVO vo = new ContactVO(name, phone, email);
			int result = dao.update(index, vo);
			if (result == 1) {
				System.out.println("정상적으로 수정 되었습니다.");
			}
		}

	}

	private static void delete() {
		System.out.println("연락처 인덱스 입력 ");
		int index = sc.nextInt();
		if (index >= 0 && index < ((ContactDAOImple) dao).getListSize()) {
			dao.delete(index);
			System.out.println("연락처가 삭제되었습니다.");
		}
	}

	private static void showMainMenu() {
		System.out.println("---------------------------------------------------------");
		System.out.println("1. 등록 | 2. 전체 검색 | 3. 상세 검색 | 4. 수정 | 5. 삭제 | 0. 종료");
		System.out.println("----------------------------------------------------------");
		System.out.println("선택 :");
	}

}

0개의 댓글