본문 바로가기
공부기록

4월 25일 Java - Calendar, File

by project100 2023. 4. 25.

특정 날짜로 Calendar 지정

set(상수, 변경시간값) : 위의 상수에 따라 해당 날짜 및 시간 값을 변경할 수 있음

 

달의 시작일과 마지막일을 구하는 메소드

getActualMinimum(Calendar, DATE); - 시작일

getActualMaximum(Calendar, DATE); - 마지막일

        // 요일출력
        int dow = cal.get(Calendar.DAY_OF_WEEK);
        System.out.println(dow);

        // 현재 '일'을 포함한 달의 마지막 날 - 이번달의 마지막 날
        int lastDay = cal.getActualMaximum(Calendar.DATE);
        // 현재 '일'을 포함한 달의 첫번째 날
        int startDay = cal.getActualMinimum(Calendar.DATE);
        System.out.println(startDay + ", " + lastDay);

        // Calendar의 날짜 지정
        // set(상수, 값)
        // 연, 월, 일 지정
        cal.set(Calendar.YEAR, 2020);
        cal.set(Calendar.MONTH, 1); // 실제 월 -1
        cal.set(Calendar.DATE,1);

        year = cal.get(Calendar.YEAR);
        month = cal.get(Calendar.MONTH) + 1;
        date = cal.get(5);
        System.out.printf("%d-%02d-%02d\n", year, month, date);
        dow = cal.get(Calendar.DAY_OF_WEEK);
        System.out.println(dow);
        lastDay = cal.getActualMaximum(Calendar.DATE);
        System.out.println(lastDay);

File처리 

프로그램에서 발생된 데이터를 유지하는 방법

1) 파일을 활용

2) 데이터베이스를 활용(*)

 

파일이란 보조기억장치(하드디스크, USB 등)에 저장된 상태의 데이터 묶음

-> 파일을 활용하려면 메모리에 적재되어야 한다. 

메모리에 적재하여 사용하는 클래스 - File class

 

File class

파일과 폴더(디렉토리, Directory)를 다루는 데 사용하는 클래스 

폴더란? 파일아나 서브폴더의 정보를 저장하고 있는 파일

 

파일작업

1) 파일 생성 : 파일 객체(인스턴스) 생성

특정 폴더에 파일 생성할 경우 : "폴더명\\파일명.확장자"

2) 파일 정보 확인

3) 파일 경로 확인

4) 파일 삭제

5) 파일 이름/경로 변경

6) 폴더 생성

7) 폴더 정보 확인 - 폴더 내용 보기(파일, 서브폴더)

8) 폴더 변경

9) 폴더 삭제 - 반드시 하위 폴더와 파일을 삭제한 후 처리해야 한다.(하위 폴더 안의 내용도 삭제해야 지워진다.)

 

File Input / Output(입출력) : 프로그램 기준

input : 파일에서 데이터를 가져오는 작업

output : 파일에서 데이터를 저장하는 작업

 

입출력이란 데이터의 연속된 흐름을 처리하는 것

->  Stream 

스트림은 단반향

입력용 스트림과 출력용 스트림을 따로 사용

 

필요 클래스

1. File 클래스

2. 파일 입출력용 스트림 클래스

FileInputStream / FileOutputStream : byte 단위

FileReader / FileWriter : 문자 단위

3. 입출력용 보조 스트림 클래스

BufferedReader / BufferedWriter : 문장/ 한 줄 단위

 

package fileinout;

import java.io.*;
import java.util.Scanner;

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

    public static void main(String[] args) throws IOException {
        // 예제용 폴더 생성
        String path = "data";
        File folder = new File("data");
        if (!folder.isDirectory()) {
            boolean b = folder.mkdir();
        }

        // FileoutputStream 사용 메소드
         outputStreamUse(path);
        
    }

    private static void outputStreamUse(String path) throws IOException {
        FileOutputStream fos = null;
        System.out.print("파일명 : ");
        String fname = sc.nextLine();
        fname += ".txt";
        File file = new File(path + "\\" + fname);

        try {
            // true가 없으면 덮어쓰기 모드, 파일명이 동일한 경우 나중에 입력된 내용으로 덮어쓰기 됨
            fos = new FileOutputStream(file, true);
            // file 뒤에 true를 넣으면 붙여 쓰기(oppend) 모드로 파일을 열어줌.
            //String str = "안녕하세요!\n";
            System.out.println("<저장 내용>");
            String str = sc.nextLine();
            str += "\n"; // 줄바꿈
            //  문자열 -> byte 배열로 변환
            byte b[] = str.getBytes();
            fos.write(b);
            System.out.println("저장완료");
        } catch (FileNotFoundException fe) {
            fe.printStackTrace();
        } catch (IOException ie) {
            ie.printStackTrace();
        } finally {
            // FileOutputStream은 가비지 처리가 안 된다.
            try {
                fos.close();
            } catch (IOException e) {
                e.printStackTrace();
            }

        }
    }
}

try문 전에 선언, try문에서 열어주고, finally 문에서 닫아주어야 한다.

package fileinout;

import java.io.*;
import java.util.Scanner;

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

    public static void main(String[] args) throws IOException {
        // 예제용 폴더 생성
        String path = "data";
        File folder = new File("data");
        if (!folder.isDirectory()) {
            boolean b = folder.mkdir();
        }

        // FileoutputStream 사용 메소드
        // outputStreamUse(path);
        
        // FirWriter 사용 메소드
        writeUse(path);
    }

    private static void writeUse(String path) {
        FileWriter fw = null;

        System.out.print("파일명 : ");
        String fname = sc.nextLine();
        fname += ".txt";

        File file = new File(path + "\\" + fname);
        try {
            fw = new FileWriter(file);

            System.out.println("<저장 내용>");
            String str = sc.nextLine();
            str += "\n"; // 줄바꿈
            fw.write(str);
            System.out.println("저장 완료");
        } catch (IOException e){
            e.printStackTrace();
        } finally { 
            try {
                fw.close();
            } catch (IOException e) {
               e.printStackTrace();
            }
        }
    }
}
package fileinout;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;

public class FileInput {
    public static void main(String[] args) {
        String path = "data";

        //FileIuputStrea 사용 메소드
         inputStreamUse(path);
    }

    private static void inputStreamUse(String path) {
        FileInputStream fis = null;

        String fname = path + "\\" + "test1.txt";
        File file = new File(fname);

        try {
            fis = new FileInputStream(file);
            int i = 0; // 파일에서 읽어온 데이터를 저장하는 변수
            // 반복적으로 read() 메소드를 사용
            // read() : byte 단위로 읽어오는 메소드, 읽어올 내용이 없으면 -1을 return
            while ((i = fis.read()) != -1){
                System.out.write(i);
                //byte를 출력하는 메소드 write(byte)
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
           try {
               fis.close();
            } catch (IOException e){
               e.printStackTrace();
           }
        }
    }
}
package fileinout;

import javax.print.DocFlavor;
import java.io.*;

public class FileInput {
    public static void main(String[] args) {
        String path = "data";

        //FileIuputStrea 사용 메소드
        // inputStreamUse(path);

        // FileReader 사용 메소드
        readerUse(path);

    }

    private static void readerUse(String path) {
        FileReader fr = null;
        String fname = path + "\\" + "test1.txt";
        File file = new File(fname);

        try {
            fr = new FileReader(file);
            int i = 0;

            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();
            }
        }
    }
}