본문 바로가기
Java

[JAVA] 스레드로 일기장 자동 백업 프로그램 만들기

by teamnova 2023. 12. 13.
728x90

저번 게시글에 이어서, 오늘은 자바의 thread를 사용해서 사용자가 작성한 일기가 3초마다 디렉토리에 저장되도록 해보겠습니다.

 

 

import java.io.*;
import java.text.SimpleDateFormat;
import java.util.Date;

public class DiaryApp {

    // 일기를 저장할 디렉토리 경로 (코드를 실행하면, 이 프로젝트에 diaries 디렉토리가 자동으로 생성됩니다.)
    private static final String DIARY_DIRECTORY = "./diaries/";

    // 메인 메서드
    public static void main(String[] args) throws IOException {
        showMenu();
    }



    // 메인 메뉴를 표시하는 메서드
    public static void showMenu() throws IOException {
        // 메뉴 출력
        System.out.println("\n\n\n=== 일기장 애플리케이션 ===");
        System.out.println("1. 일기 작성");
        System.out.println("2. 일기 읽기");
        System.out.println("3. 일기 목록 보기");
        System.out.println("4. 종료");
        System.out.print("선택: ");

        // 사용자 입력 처리
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        int choice = Integer.parseInt(reader.readLine());
        switch (choice) {
            case 1:
                writeDiary();
                break;
            case 2:
                readDiary();
                break;
            case 3:
                listDiaries();
                break;
            case 4:
                System.out.println("    >> 애플리케이션을 종료합니다.");
                return;
            default:
                System.out.println("    >> 잘못된 선택입니다.");
                showMenu();
        }
    }

    // 일기 목록 출력 메서드
    public static void listDiaries() throws IOException {
        // 일기 디렉토리 내의 파일 목록
        File directory = new File(DIARY_DIRECTORY);
        File[] files = directory.listFiles();

        // 일기 목록 출력
        if (files == null || files.length == 0) {
            System.out.println("    >> 저장된 일기가 없습니다.");
            showMenu();
            return;
        }
        System.out.println("=== 일기 목록 ===");
        for (File file : files) {
            System.out.println(" * "+file.getName().replace(".txt", ""));
        }
        showMenu();
    }

    // 일기 작성 메서드
    public static void writeDiary() throws IOException {
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));

        // 현재 날짜
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        String currentDate = sdf.format(new Date());

        // 사용자 입력 받기
        System.out.println("=== " + currentDate + " 일기 작성 ===");
        System.out.println("일기 내용을 입력하세요. (입력을 종료하려면 'END'를 입력하세요)");

        // 일기 내용 작성
        StringBuilder content = new StringBuilder();
        while (true) {
            String line = reader.readLine();
            if ("END".equalsIgnoreCase(line)) {
                break;
            }
            content.append(line).append("\n");
        }

        // 파일 저장 부분
        File diaryDir = new File(DIARY_DIRECTORY);
        if (!diaryDir.exists()) {
            diaryDir.mkdir(); // 디렉토리가 없다면 생성함
        }

        // 파일 작성
        try (FileWriter writer = new FileWriter(DIARY_DIRECTORY + currentDate + ".txt")) {
            writer.write(content.toString());
            System.out.println("    >> 일기 저장 완료!");
        }
        showMenu();
    }

    // 일기 읽기 메서드
    public static void readDiary() throws IOException {
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        System.out.print("읽고 싶은 일기의 날짜 (예: 2023-10-19)를 입력하세요: ");
        String date = reader.readLine();

        // 해당 날짜의 일기 파일 불러오기
        File diary = new File(DIARY_DIRECTORY + date + ".txt");
        if (!diary.exists()) {
            System.out.println("    >> 해당 날짜의 일기가 존재하지 않습니다.");
            showMenu();
            return;
        }

        // 해당 일기 출력
        System.out.println("=== " + date + " 일기 ===");
        try (BufferedReader diaryReader = new BufferedReader(new FileReader(diary))) {
            String line;
            while ((line = diaryReader.readLine()) != null) {
                System.out.println(line);
            }
        }
        showMenu();
    }
}