본문 바로가기

JAVA

Java_12강(파일/폴더 예제)

  MVC 패턴 예제 업그레이드

폴더를 만든 뒤 그 안에 날짜별 파일을 생성하고 일기를 쓰는 예제를 만들어보자.

 

- main

package com.main;

import com.controller.DiaryController;

public class MainClass {
    public static void main(String[] args) {
        DiaryController pc = new DiaryController();
        pc.run();
    }
}

 

- InOutClass

package com.view;

import java.util.Scanner;

public class InOutClass {
    // 1. 키보드로부터 데이터를 입력
    private Scanner scan = new Scanner(System.in);

    // 문자열 입력 메소드
    public String inStr(String str) {
        // 입력 유도용 안내문구(str)을 출력하고 입력값을 받아서 넘김
        onePrint(str);
        String s = scan.nextLine();

        return s;
    }

    // 정수 입력 메소드
    public int inNum(String str) {
        onePrint(str);
        String s = scan.nextLine();
        int num = -1;

        // 아무것도 입력하지 않았을 때
        if (s.equals("")) {
            num = -1;
            return num; // 메소드 종료
        }
        // 숫자가 아닌 문자가 입력됐을 때
        try {
            num = Integer.parseInt(s);
        } catch (Exception e) {
            twoPrint("잘못된 입력입니다. \n");
            num = -1;
        }
        return num;
    }

    // 2. 모니터로 데이터를 출력
    // 줄바꿈 안 하는 출력 메소드
    public void onePrint(String str) {
        System.out.print(str);
    }

    // 줄바꿈 하는 출력 메소드
    public void twoPrint(String str) {
        System.out.println(str);
    }
}

 

main과 InOutClass는 이전 예제와 동일하다.

그러나 DiaryController는 다르다. 우선 DataClass는 전혀 필요가 없다.

 

- DiaryController

package com.controller;

import com.view.InOutClass;

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

public class DiaryController {
    // 입출력 장치 객체
    private InOutClass io = new InOutClass();

    File folder = new File("data");
    Scanner sc = new Scanner((System.in));

    BufferedWriter bw = null;
    FileWriter fw = null;

    FileReader fr = null;
    BufferedReader br = null;

    String title, weather, mood, content;

    // 전체 제어 메소드
    public void run() {
        // 메뉴 번호 저장 변수
        int menu = -1;

        io.twoPrint("다이어리 관리 프로그램");
        io.twoPrint("-------------------");

        while(true) {
            // 메뉴 출력
            menuShow();

            menu = io.inNum("입력 > ");

            if (menu == 0) {
                io.twoPrint("프로그램 종료");
                break;
            }

            // 메뉴 번호에 따라 기능 처리
            switch (menu) {
                case 1: // 저장 메소드 실행
                    saveDate();
                    break;
                case 2: // 읽기 메소드 실행
                    readData();
                    break;
                case 3: // 수정 메소드 실행
                    updateData();
                    break;
                case 4: // 삭제 메소드 실행
                    deleteData();
                    break;
                default:
                    io.twoPrint("0~5번까지 입력하세요.");
            }
        } // while end
    } // run end

    // 메뉴 출력 메소드
    private void menuShow() {
        io.twoPrint("1. 일기 저장");
        io.twoPrint("2. 일기 읽기");
        io.twoPrint("3. 일기 수정");
        io.twoPrint("4. 일기 삭제");
        io.twoPrint("0. 종료");
    }

    // 저장 메소드
    private void saveDate() {
        io.twoPrint("-- 일기 저장 --");
        io.twoPrint("--------------");

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

        // 생성자를 사용할 경우 입력을 모두 받아둔다.
        title = sdf1.format(today);
        io.twoPrint("제목(오늘 날짜) : " + title);
        weather = io.inStr("날씨 : ");
        mood = io.inStr("기분 : ");
        content = io.inStr("내용 : ");

        try {
            if (!folder.isDirectory()) { // 폴더가 없으면
                folder.mkdir(); // 폴더를 만들자
            }

            File file = new File("data\\" + title + ".txt");

            fw = new FileWriter(file, true);
            bw = new BufferedWriter(fw);


            bw.write(weather + "\n" + mood + "\n" + content  + "\n" );
            bw.flush(); // 남아있는 것이 없도록 해줌

            io.twoPrint("저장 완료. \n");

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

    // 읽기 메소드
    private void readData() {
        io.twoPrint("-- 일기 읽기 --");
        io.twoPrint("--------------");

        // 읽을 데이터 검색
        String sTitle = io.inStr("검색할 이름 : ");

        try {
            File file = new File("data\\" + sTitle + ".txt");

            fr = new FileReader(file);
            br = new BufferedReader(fr);

            String str = null;
            while ((str = br.readLine()) != null) {
                System.out.println(str); // 각 라인을 읽음
            }
            io.twoPrint("--------------");

        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                // fis.close();
                br.close(); // 제거는 역순 => br을 먼저 제거
                fr.close();
            } catch (IOException e) { }
        }
    }

    // 수정 메소드
    private void updateData() {
        io.twoPrint("-- 일기 수정 --");
        io.twoPrint("--------------");

        // 수정할 데이터 검색
        String sTitle = io.inStr("수정할 일기 제목 : ");
        File file = new File("data\\" + sTitle + ".txt");

        int menu = -1;

        io.twoPrint("1. 전체 수정");
        io.twoPrint("2. 일부 수정");

        menu = io.inNum("입력 > ");

        switch (menu) {
            case 1: // 전체 수정
                try {
                    fw = new FileWriter(file);
                    bw = new BufferedWriter(fw);

                    weather = io.inStr("날씨 : ");
                    mood = io.inStr("기분 : ");
                    content = io.inStr("내용 : ");

                    bw.write(weather + "\n" + mood + "\n" + content  + "\n" );

                    io.twoPrint("수정 완료.\n");
                } catch (IOException ie) {
                    ie.printStackTrace();
                } finally {
                    try {
                        bw.close(); // BufferedWriter 먼저 정리
                        fw.close(); // FileWriter 사용

                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }

                break;
                
              // 일부 수정 코드 작업X

//            case 2: // 일부 수정
//                br = new BufferedReader(fr);
//                String str = null;
//
//                int idx = 1;
//
//
//                int c_num = io.inNum("수정을 원하는 라인 넘버를 입력해주세요 > ");
//
//                while((str = br.readLine()) != null) {
//                    if (idx == c_num && idx == 1) {
//                        weather = io.inStr("날씨 : ");
//                    } else if (idx == c_num && idx == 2) {
//                        mood = io.inStr("기분 : ");
//                    } else if (idx == c_num && idx == 3) {
//                        content = io.inStr("내용 : ");
//                    }
//                }
//
//                break;

            default:
                io.twoPrint("1~2번까지 입력하세요.");
        }

    } // updateData end

    // 삭제 메소드
    private void deleteData() {
        io.twoPrint("-- 일기 삭제 --");
        io.twoPrint("--------------");

        String sTitle = io.inStr("삭제할 이름 : ");
        File file = new File("data\\" + sTitle + ".txt");

        if (file.exists()) {
            String yn = io.inStr("삭제할까요?(y) ");
            if(yn.equals("y")){ // 입력값이 "y"라면
                file.delete();
                io.twoPrint("파일 삭제 성공\n");
                return;
            } else {
                System.out.println("파일 삭제 실패");
            }
        } else {
            System.out.println("파일이 존재하지 않습니다.");
        }
    }
}

'JAVA' 카테고리의 다른 글

Java_11강  (0) 2022.09.28
Java_10강  (0) 2022.09.26
Java_9강  (0) 2022.09.25
Java_8강  (0) 2022.09.23
Java_7강  (0) 2022.09.22