package com.kh.practice.file.model.dao;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;

public class FileDAO {
	
	public boolean checkName(String file) {
		// 존재하는 파일이 있는지 확인 후 반환
		// File 객체를 생성하는 매개변수 있는 생성자에 file을 매개변수로 넘겨줌
		// 해당 파일이 있는지 없는지에 대한 boolean 값을 반환
		
//		boolean isTrue = false;
//		
//		File f = new File(file);
//		
//		if(f.isFile()) {
//			isTrue = true;
//		}
//		return isTrue;
		
		
		// 강사님 풀이
		try(FileReader fw = new FileReader(file);) {
			
		} catch(FileNotFoundException e) {
//			e.printStackTrace();
			return false;
		} catch(IOException e1) {
			e1.printStackTrace();
		}
		
		return true;
		
	}
	
	
	public void fileSave(String file, String s) {
		// 매개변수로 받은 파일 명에 문자열 저장
		
		try(DataOutputStream dos = new DataOutputStream(new FileOutputStream(file, true))) {
			dos.writeUTF(s);;
			
			
		} catch(IOException e) {
			e.printStackTrace();
		}
		
		
	}
	
	
	public StringBuilder fileOpen(String file) {
		// 매개변수로 받은 파일 명을 이용하여 저장되어 있는 데이터 반환
		
		StringBuilder sb = new StringBuilder();
		
		try(DataInputStream dis = new DataInputStream(new FileInputStream(file))) {
			
			// 파일에 null 값이 들어갈 수도 있기 때문에 null 체크
			String s = "";
			while((s=dis.readUTF())!=null) {
				sb.append(dis+"\\n");	// 여기서 여러 하나 발생			
			}
			// 아마... 여기서 뜨는 어떤 에러를 삭제했음
			
		} catch(FileNotFoundException e) {
			e.printStackTrace();
		} catch(IOException e) {
			e.printStackTrace();
		}
		
		
		return sb;
		
		
	}
	
	
	public void fileEdit(String file, String s) {
		// 매개변수로 받은 파일 명에 문자열 저장
		
		try(DataOutputStream dos = new DataOutputStream(new FileOutputStream(file, true))) {
			dos.writeUTF(s);
			
			
		} catch(IOException e) {
			e.printStackTrace();
		}
		
		
	}
	

}
package com.kh.practice.file.controller;

import com.kh.practice.file.model.dao.FileDAO;

public class FileController {

	private FileDAO fd = new FileDAO();
	
	
	public boolean checkName(String file) {
		// DAO에 매개변수를 전달하고, DAO로부터 전달받은 값을 다시 반환
		
		boolean result = fd.checkName(file);
		
		return result;
	}
	
	
	public void fileSave(String file, StringBuilder sb) {
		// 전달받은 매개변수를 변경하고 DAO에 전달
		// 매개변수로 넘어온 sb를 String으로 바꿔 fd의 fileSave()메소드 매개변수로
		// file과 String을 넘김
		
		String s = sb.toString();
		
		fd.fileSave(file, s);
		
	}
	
	
	public StringBuilder fielOpen(String file) {
		// DAO에 매개변수를 전달하고, DAO로부터 전달받은 값을 다시 반환
		// fd의 fileOpen() 매개변수로 file을 넘겨주고 그 반환 값을 그대로 받아 또 반환
		
		return fd.fileOpen(file);
		
	}
	
	
	
	public void fileEdit(String file, StringBuilder sb) {
		// 전달받은 매개변수를 변경하고 DAO에 전달
		// 매개변수로 넘어온 sb를 String으로 바꿔 fd의 fileEdit()메소드 매개변수로
		// file과 String을 넘김
		
		String s = sb.toString();
		
		fd.fileEdit(file, s);
		
	}
	
	
}
package com.kh.practice.file.view;

import java.util.Scanner;

import com.kh.practice.file.controller.FileController;

public class FileMenu {
	
	private Scanner sc = new Scanner(System.in);
	private FileController fc = new FileController();
	
	public void mainMenu() {
		
		System.out.println("***** My Note *****");
		
		while(true) {
			
			System.out.println("1. 노트 새로 만들기");
			System.out.println("2. 노트 열기");
			System.out.println("3. 노트 열어서 수정하기");
			System.out.println("9. 끝내기");
			System.out.print("메뉴 번호 : ");
			int num = Integer.parseInt(sc.nextLine());
			
			switch(num) {
			case 1: fileSave(); break;
			case 2: fileOpen(); break;
			case 3: fileEdit(); break;
			case 9: 
				System.out.println("프로그램을 종료합니다.");
				return;
			default:
				System.out.println("잘못 입력하셨습니다. 다시 입력해주세요.");
			}
			
			
		}
		
		
	}
	
	
	
	public void fileSave() {
		// 파일명과 저장할 값을 받음
		
		StringBuilder sb = new StringBuilder();
		
		System.out.println("파일에 저장할 내용을 입력하세요.");
		System.out.println("ex끝it 이라고 입력하면 종료됩니다.");
		
		while (true) {
			
			System.out.print("내용 :");
			String content = sc.nextLine();
			
			if(content.equals("ex끝it")) {
				break;
			}
			
			sb.append(content+"\\n");
		
		}
		
		while(true) {
			
			System.out.print("저장할 파일 명을 입력해주세요(ex. myFile.txt) : ");
			String file = sc.nextLine();
			
			if(fc.checkName(file)==true) {
				System.out.print("이미 존재하는 파일입니다. 덮어쓰시겠습니까?(y/n) : ");
				char yn = sc.nextLine().charAt(0);
				
				if(yn=='y' || yn=='Y') {
					fc.fileSave(file, sb);
					return;
				} else if(yn=='n' || yn=='N') {
					break;
				}
	
			} else {
				fc.fileSave(file, sb);
				break;
			}
		}

		
	}
	
	
	public void fileOpen() {
		// 파일명을 받아 저장된 데이터 출력
		
		System.out.print("열 파일 명 : ");
		String file = sc.nextLine();
		
		boolean isThere = fc.checkName(file);
		
		if(isThere == true) {
			
			System.out.println((fc.fielOpen(file)));			
		
		} else {
			System.out.println("없는 파일입니다.");
			mainMenu();
			return;
		}
		
		
		
	}
	
	
	public void fileEdit() {
		// 파일명과 저장할 값을 받음
		
		StringBuilder sb = new StringBuilder();
		
		System.out.print("수정할 파일 명 : ");
		String file = sc.nextLine();
		
		boolean isThere = fc.checkName(file);
		
		if(isThere == false) {
			System.out.println("없는 파일입니다.");
			mainMenu();
		} else {
			
			while (true) {
				
				System.out.println("파일에 저장할 내용을 입력하세요.");
				System.out.println("ex끝it 이라고 입력하면 종료됩니다.");
				System.out.print("내용 : ");
				String content = sc.nextLine();
				
				if(content.equals("ex끝it")) {
					break;
				}
				
				sb.append(content);
			
			}
			
			
		}
		
		
		
	}
	
}
package com.kh.practice.file.run;

import com.kh.practice.file.view.FileMenu;

public class Run {

	public static void main(String[] args) {
		
		FileMenu fm = new FileMenu();
		fm.mainMenu();
	}

}