[230802] File, 경로 작성 / 시험 (ArrayList 추가, 수정, 삭제, 조회, 전체조회) (DAY26)

MJ·2023년 8월 3일

수업 TIL🐣💚

목록 보기
27/68

java.io.File 클래스

  1. 파일, 디렉터리(폴더)를 관리하는 클래스
  2. 파일, 디렉터리를 생성/삭제가 가능
  3. 파일, 디렉터리의 각종 정보(이름, 크기, 최종수정일 등)를 확인할 수 있음

경로 작성 방법

  1. 윈도우 : 백슬래시(), Java에서 백슬래시 입력하는 방법(\)
  2. 리눅스 : 슬래시(/)
  3. java.io.File 클래스에는 플랫폼에 따라서 경로 구분자를 자동으로 바꿔주는 separator 필드 값이 있음
  public static void ex01() {

    // 디렉터리 생성/삭제
    // File 객체 선언
    File dir;
    // File 객체 생성
    dir = new File("C:/storage"); // C드라이브 아래 storage 디렉터리, File 객체가 이 디렉터리를 타겟으로 동작
    // 리눅스 기호인 슬래시(/) 써도 자바가 자동으로 바꿔줌 
    // -> 최종적으로 배포할 때는 리눅스로 배포할 확률 크기 때문에 '/' 사용하기
    // dir = new File("C:" +File.separator+ "storage"); //separator 사용, 윈도우와 리눅스에서 동시에 돌아감

    // C:\\storage 디렉터리가 없으면 만들고 있으면 지우기
    if (dir.exists()) {
      //      dir.deleteOnExit(); // Java 실행이 끝나면 지우기
      dir.delete(); // 지금 당장 지우기
      System.out.println("C:\\storage 디렉터리 삭제 완료");
    } else {
      dir.mkdirs(); // 디렉터리 내부에 또 다른 디렉터리도 만들 수 있음
      System.out.println("C:\\storage 디렉터리 생성 완료");
    }
  }

파일, 디렉터리 정보 확인

  • listFiles() : 모든 File 객체를 저장한 File 반환
  • getName() : 이름 반환
  • getParent() : 저장된 디렉터리 반환
  • getPath() : getParent() + getName()
  • lastModified : 최종수정일을 long 타입으로 반환
  • length() : 크기를 long 타입의 바이트 단위로 반환
  • isDirectory() : 디렉터리면 true 반환
  • isFile() : 파일이면 true 반환

package ex04_Library;

import java.util.ArrayList;
import java.util.InputMismatchException;
import java.util.List;
import java.util.Scanner;

public class Library {

  private List<Book> books; //선언
  private Scanner sc; //선언

  // new Library()
  public Library() {
    books = new ArrayList<Book>(); //생성
    sc = new Scanner(System.in); //생성
  }

  /**
   * 등록<br>
   */
  private void addBook() throws InputMismatchException {
    System.out.println("====등록====");
    System.out.println("책 제목 입력");
    String title = sc.next();
    System.out.println("책 가격 입력");
    int price = sc.nextInt();
    books.add(new Book(title, price));
    System.out.println(title + " 책이 등록되었습니다.");
  }



  /**
   * 삭제<br>
   */
  private void deleteBook() throws RuntimeException {
    System.out.println("====삭제====");
    if (books.isEmpty()) {
      throw new RuntimeException("도서관에 등록된 책이 없습니다");
    }
    System.out.println("삭제할 책의 제목 입력 >>>");
    String title = sc.next();
    if (title.isEmpty()) {
      throw new RuntimeException("삭제할 책의 제목이 입력되지 않았습니다");
    }
    // 객체 기반 삭제(동일한 객체를 찾아서 삭제)
    // 동일한 객체인지 비교하기 위해서는 Book 클래스에 equals 메소드가 오버라이드 되어 있어야 한다.
    for (Book book : books) {
      if (title.equals(book.getTitle())) { //앞: 입력된 제목, 뒤: 도서관에서 꺼낸 제목
        books.remove(book);
        System.out.println(book + "책이 삭제되었습니다.");
        return; //책 지우면 실행 종료
      }
    }
    System.out.println(title + " 제목을 가진 책이 없습니다.");
  }

  /**
   * 수정<br>
   * 수정할 책의 제목을 입력받아서 해당 책의 가격을 수정하는 메소드
   * @throws RuntimeException 책이 0권이거나 수정할 책의 제목이 입력되지 않았을 때 발생하는 예외
   * @throws InputMismatchException 책의 가격을 정수로 입력하지 않았을 대 발생하는 예외
   */
  private void modifyBook() throws RuntimeException, InputMismatchException {
    System.out.println("====수정====");
    if (books.isEmpty()) {
      throw new RuntimeException("도서관에 등록된 책이 없습니다");
    }
    System.out.println("수정할 책의 제목 입력 >>>");
    String title = sc.next();
    if (title.isEmpty()) {
      throw new RuntimeException("수정할 책의 제목이 입력되지 않았습니다");
    }
    for (Book book : books) {
      if (title.equals(book.getTitle())) {
        System.out.println("수정할 가격을 입력하세요. 현재가: " + book.getPrice() + "원");
        int price = sc.nextInt();
        book.setPrice(price);
        System.out.println(title + "책의 가격이 " + price + "원으로 수정되었습니다.");
        return;
      }
    }
    System.out.println(title + " 제목을 가진 책이 없습니다.");

  }

  /**
   * 조회<br>
   * 조회할 책의 제목을 입력 받아서 해당 책의 정보를 출력하는 메소드
   * @throws RuntimeException 책이 0권이거나 조회할 책의 제목이 입력되지 않았을 때 발생하는 예외
   */
  private void queryBook() throws RuntimeException {
    System.out.println("====조회====");
    if (books.isEmpty()) {
      throw new RuntimeException("도서관에 등록된 책이 없습니다");
    }
    System.out.println("조회할 책의 제목 입력 >>>");
    String title = sc.next();
    if (title.isEmpty()) {
      throw new RuntimeException("조회할 책의 제목이 입력되지 않았습니다");
    }

    for (Book book : books) {
      if (title.equals(book.getTitle())) {
        System.out.println("제목: " + book.getTitle() + " 가격: " + book.getPrice() + "원");
        return;
      }
    }
    System.out.println(title + " 제목을 가진 책이 없습니다.");
  }

  /**
   * 전체조회<br>
   */
  private void queryAllBook() throws RuntimeException {
    System.out.println("====전체조회====");
    int size = books.size();
    System.out.println("전체 보유 도서 수: " + size + "권");

    if (books.isEmpty()) {
      throw new RuntimeException("도서관에 등록된 책이 없습니다");
    }
    for (int i = 0; i < size; i++) {
      System.out.println((i + 1) + "번째 도서: " + books.get(i));
    }
  }

  /**
   * 운영<br>
   */
  public void manage() {

    // 사용자가 종료 명령을 내릴때까지 프로그램은 종료되지 않는다
    while (true) {

      try {
        System.out.println("1.등록 2.삭제 3.수정 4.조회 5.전체조회 0.종료");
        String choice = sc.next();

        switch (choice) {
        case "1":
          addBook();
          break;
        case "2":
          deleteBook();
          break;
        case "3":
          modifyBook();
          break;
        case "4":
          queryBook();
          break;
        case "5":
          queryAllBook();
          break;
        case "0":
          System.out.println("도서관리프로그램을 종료합니다");
          return; //반환값 없는 return = 종료명령
        default:
          System.out.println("잘못된 입력입니다. 다시 시도하세요");
          break;
        }
      } catch (Exception e) {
        System.out.println(e.getMessage());
      }

    }

  }


}

0개의 댓글