본문 바로가기
공부기록/실습

4월 26일 Java - 일기장 만들기

by project100 2023. 4. 26.

간이 프로젝트
  일기장 만들기(파일 입출력을 활용한..)
  파일명은 날짜로 작성. 예) 20230425.txt
  메뉴>
  1. 일기 작성하기
  2. 일기 불러오기
  3. 일기 수정하기
  4. 일기 삭제하기
  0. 종료
  참고)
  수정하기는 같은 날짜에 새로운 내용을 덮어쓰는 형태로 작성할 것.
  지난 날짜의 일기는 새로 작성할 수 없음.

 

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

public class DiaryMain {
    static Scanner sc = new Scanner(System.in);

    public static void main(String[] args) {

        System.out.println("-------------------------------");
        System.out.println("★ 간이프로젝트 - 일기장 만들기 ★");
        System.out.println("-------------------------------");

        int menu = -1;
        while (true) {

            System.out.println("메뉴> ");
            System.out.println("1. 일기 작성하기");
            System.out.println("2. 일기 불러오기");
            System.out.println("3. 일기 수정하기");
            System.out.println("4. 일기 삭제하기");
            System.out.println("0. 종료");
            System.out.print("선택> ");
            try {
                menu = Integer.parseInt(sc.nextLine());
            } catch (InputMismatchException e) {
                System.out.println("이전 메뉴로 돌아갑니다.");
            } catch (NumberFormatException ne) {

            }

            if (menu == 0) {
                System.out.println("종료합니다.");
                break;
            }

            String path = "data";
            File folder = new File("data");
            if (!folder.isDirectory()) {
                boolean b = folder.mkdir();
            }
            switch (menu) {
                case 1:
                    write();
                    break;
                case 2:
                    reader();
                    break;
                case 3:
                    correction();
                    break;
                case 4:
                    delete();
                    break;
                default:
                    System.out.println("0~4까지만 입력하세요.");
                    System.out.println(" ");
            }
        }
    }


    private static void delete() {
        String path = "M:\\Raspberry-work\\java\\diary main\\data";
        File folder = new File(path);
        FileReader fr = null;

        File list[] = folder.listFiles();
        for (File f : list) {
            System.out.println(f.getName());
        }

        System.out.print("삭제할 파일 : ");
        String fname = sc.nextLine();
        File fd = new File(path + "\\" + fname + ".txt" + "");
        if (fd.exists()) {//파일 유무 확인 먼저.
            boolean b2 = fd.delete();
            if (b2) {//파일 이름 구하기 : getName()
                System.out.println(fd.getName() + " 삭제 성공");
            } else {
                System.out.println("삭제 실패");
            }
        } else {
            System.out.println("파일이 없습니다.");
        }
    }

    private static void correction() {
        String path = "M:\\Raspberry-work\\java\\diary main\\data";
        File folder = new File(path);
        FileWriter fw = null;

        File list[] = folder.listFiles();
        for (File f : list) {
            System.out.println(f.getName());
        }
        System.out.print("수정할 일기 : ");
        String fname = sc.nextLine();
        File fc = new File(path + "\\" + fname + ".txt" + "");

        try {
            fw = new FileWriter(fc);
            StringBuffer sb = new StringBuffer();
            //file 뒤에 true를 넣으면, append 모드로 동작.
            //new FileWriter(file, true);
            System.out.println("<수정할 내용>");
            while (sc.hasNextLine()) {
                String s = sc.nextLine();
                if (s.equals(""))
                    break;
                sb.append(s + "\n");
            }
            fw.write(sb.toString());
            System.out.println("수정 완료");
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                fw.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }


    private static void reader() {
        String path = "M:\\Raspberry-work\\java\\diary main\\data";
        File folder = new File(path);
        FileReader fr = null;

        if (folder.exists()) {
            File list[] = folder.listFiles();
            //폴더 내부의 파일목록 가져오기 : listFiles()
            for (File f : list) {
                //System.out.println(f.getName());
                if (f.isFile()) {
                    System.out.println("일기 날짜 : " + f.getName());

                    try {
                        fr = new FileReader(f);
                        int i = 0;
                        System.out.println("내용> ");
                        while ((i = fr.read()) != -1) {
                            System.out.print((char) i);
                        }

                    } catch (FileNotFoundException e) {
                        e.printStackTrace();
                    } catch (IOException e) {
                        e.printStackTrace();
                    } finally {
                        try {
                            fr.close();
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                    }
                }
            }
        }
    }


    private static void write() {
        Calendar cal = Calendar.getInstance();
        int year = cal.get(Calendar.YEAR);
        int month = cal.get(Calendar.MONTH) + 1; // 배열 값이어서 + 1
        int date = cal.get(5); //DATE = 5

        Date today = new Date();
        SimpleDateFormat sdf1 = new SimpleDateFormat("yyyyMMdd");

        String fname = sdf1.format(today);
        fname += ".txt";

        File f = new File("data\\" + fname);
        FileWriter fw = null;
        BufferedWriter bw = null;


        try {
            //createNewFile() 파일 생성 성공 시 true.
            //같은 이름의 파일 존재 시 false.
            boolean b = f.createNewFile();
            if (b) {
                System.out.println("파일 생성 성공");

                try {
                    fw = new FileWriter(f);
                    bw = new BufferedWriter(fw);
                    StringBuffer sb = new StringBuffer();

                    System.out.println("<저장내용>");
                    while (sc.hasNextLine()) {
                        String s = sc.nextLine();
                        if (s.equals(""))
                            break;
                        sb.append(s + "\n");
                    }
                    bw.write(String.valueOf(sb));
                    bw.flush();

                    System.out.println("저장 완료");

                } catch (IOException e) {
                    e.printStackTrace();
                } finally {
                    try {
                        bw.close();
                        fw.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }

            } else {
                System.out.println("이미 파일이 존재합니다.");
            }
        } catch (IOException e) {
            e.printStackTrace();//예외사항 출력.
        }
    }
}