Java - 7. I/O: File

godkimchichi·2020년 9월 24일
0

고급자바

목록 보기
21/47

스트림 들어가기전 기본중의 기본 file에 대해서 알아봅시다
책 51쪽

File 클래스

  • 시스템에 있는 파일이나 디렉토리를 추상화한 클래스
  • 파일의 생성, 삭제, 크기, 읽기 또는 쓰기 모드 등과 같은 파일 자체를 관리하기 위한 클래스
  • 책 51쪽

File 객체 만들기

  • T01_FileTest.java
  • main()에서 실행

1. new File(String 파일 또는 경로명)

  • 실제 파일이 생성되는 것은 아니나 이 파일을 다루기 위해 경로를 참조하는 파일 객체를 만드는 것
  • 디렉토리와 디렉토리 사이 또는 디렉토리와 파일명 사이의 구분문자는 '\'를 사용하거나 '/'를 사용할 수 있다.
    • '/' 사용시 두개씩 써줘야함
    • 보통 '/'를 사용하나, 윈도우만 역슬래시를 사용함
File file = new File("d:/D_Other/test.txt");
// 실제 디스크에 test.txt가 생성되는 것은 아니지만
// 이 파일을 다루기 위해 이 경로를 참조하는 파일 객체를 만듬

System.out.println("파일명 : " + file.getName());
// text.txt
System.out.println("파일 여부 : " + file.isFile()); 
// false: 해당 경로에 실제 존재하는 파일의 여부를 알려주나, 아직 이 파일이 없기때문에 false리턴

isFile과 isDirectory 예시

File file2 = new File("d:/D_Other");
System.out.print(file2.getName() + "은 ");
if(file2.isFile()) {
  System.out.print("파일");
} else if(file2.isDirectory()){
  System.out.print("디렉토리(폴더)");
}
// 출력: D_Other은 디렉토리(폴더)

2. new File(File parent, String child)

  • 'parent'디렉토리 안에 있는 'child'파일 또는 디렉토리를 갖는다
File file3 = new File(file2, "test.txt"); // file2 = d:/D_Other
System.out.println(file3.getName() + "의 용량 크기 : " + file3.length() + "bytes");
// 출력: test.txt의 용량 크기 : 53bytes

3. new File(String parent, String child)

File file4 = new File("d:/D_Other", "text.txt");

file4.getAbsolutePath();
// 절대 경로 : d:\D_Other\test.txt

file4.getPath();
// 경로 : d:\D_Other\test.txt (생성자에 입력한 경로)

file4.getCanonicalPath(); // IOException 던짐
// 표준 경로 : D:\D_Other\test.txt

T01_FileTest.class.getResource("T01_FileTest.class");
// 현재 클래스의 URL : 
// file:/D:/A_TeachingMaterial/3.HighJava/workspace/
// JavaIOTest/bin/kr/or/ddit/basic/T01_FileTest.class
// 스키마: file: 부분

T01_FileTest.class.getResource("T01_FileTest.class").getPath()
// 스키마를 제외한 현재 클래스의 URL :
// /D:/A_TeachingMaterial/3.HighJava/workspace/
// JavaIOTest/bin/kr/or/ddit/basic/T01_FileTest.class

디렉토리(폴더) 만들기

  • 권한이 있다는 가정 하에서 실시
  • mkdir(), mkdirs() 모두, 만들기를 성공하면 true, 실패하면 false를 반환

1. mkdir()

  • File객체의 경로 중 마지막 위치에 디렉토리를 만든다.
  • 중간의 경로가 모두 미리 만들어져 있어야 한다.
File file5 = new File("d:/D_Other/연습용");
// d:/D_Other 폴더가 미리 있어야 생성 가능
// 없다면 중간 경로도 생성해주는 mkdirs()를 이용해서 만들어야 함
if(file5.mkdir()) { // 생성결과에 따라 t/f반환
  System.out.println(file5.getName() + " 만들기 성공! >ㅁ<" );
}else {
  System.out.println(file5.getName() + " 만들기 실패!!! ㅠㅅㅠ");
}
// 중간 경로 없이 잘 만들어졌음~!

2. mkdirs()

  • 중간의 경로가 없으면 중간의 경로도 새롭게 맏는 후 마지막 위치에 디렉토리를 만들어 준다.
File file6 = new File("d:/D_Other/test/java/src");
if(file6.mkdirs()) {
  System.out.println(file6.getName() + " 만들기 성공! >ㅁ<" );
}else {
  System.out.println(file6.getName() + " 만들기 실패!!! ㅠㅅㅠ");
}

File 클래스 주요 메서드

  • boolean
    • isFile(): 파일여부 확인
    • isDirectory(): 디렉토리(폴더)여부 확인
    • canRead(): 파일 읽을 수 있는지
    • canWrite(): 파일 쓸 수 있는지
    • createNewFile(): 파일 새로 생성하면 true, 못하면 false
    • delete(): 파일 지우고 성공하면 true
    • exists(): 파일이나 디렉토리가 성공하면 true
    • mkdir()
    • renameTo()
  • String
    • getName(): 파일명
    • getPath(): 경로 (객체 생성시 생성자에 입력한 경로)
    • getAbsolutePath(): 파일의 절대경로
    • getCanonicalPath(): 파일의 정규(표준)경로
  • long
    • lastModified(): 최종수정날짜
    • length(): 파일크기(bytes)
  • String[]
    • list()

예시

  • T02_FileTest.java
  • main()내에서 실행

1. exists(), createNewFile(), getAbsolutePath()

  • exists(): 접근하고자 하는 경로에 그 파일이 존재한다면 true
  • createNewFile(): 파일만 만드는 것. 컨텐츠는 스트림객체로 채움
  • getAbsolutePath(): 절대경로
File f1 = new File("d:/D_Other/sample.txt");
File f2 = new File("d:/D_Other/test.txt");

if(f1.exists()) { // 접근하고자 하는 경로에 그 파일이 존재한다면 true
  System.out.println(f1.getAbsolutePath() + "은 존재합니다.");
}else {
  System.out.println(f1.getAbsolutePath() + "은 없는 파일입니다.");
  
  try {
    if(f1.createNewFile()) {
      System.out.println(f1.getAbsolutePath() + "파일을 새로 만들었습니다."); // 파일만 만드는 것임. 컨텐츠는 스트림객체로 채움.
    }
  } catch (IOException e) {
    e.printStackTrace();
  }
}

2. listFiles(), list()

  • listFiles(): 파일 객체를 반환
  • list(): 파일명 반환
// listFiles() 예시
File f3 = new File("d:/D_Other") // File객체 생성 (파일, 디렉토리 모두 가능)
File[] files = f3.listfiles(); // f3에 들어있는 것을 listFiles를 통해 File배열에 담음

// f3(디렉토리)에 담긴 file객체들 꺼내 출력
for (File file : files) {
  System.out.print(files.getName() + " => ");
  if(file.isFile()){
    System.out.println("파일");
  }else if (file.isDirectory()){
    System.out.println("디렉토리");
  }
}
  • f3(디렉토리)에 담긴 file객체들 꺼내 출력한 결과
// list() 예시
String[] strFiles = f3.list();
for (String file : strFiles) {
System.out.println(file);
}
// String으로 반환된 값을 담은 배열.
// isFile()이나 isDirectory()이용 불가
  • 출력 결과

메서드를 이용한 디렉토리 정보 출력 ★

  • 복잡해서 잘 이해 안가지만 차근차근 보면 이해할 수 있을거야!

1단계: 출력 메서드 생성

  • 재귀호출 이용해 하위 디렉토리 내역까지 모두 출력할것임
private static void displayFileList(File dir) {
  System.out.println("[" + dir.getAbsolutePath() + "] 디렉토리의 내용");

  // 디렉토리 안의 모든 파일 및 디렉토리 목록을 가져온다.
  File[] files = dir.listFiles();

  // 하위 디렉토리 정보를 저장한 ArrayList 생성
  // -> File 배열의 인덱스 저장
  List<Integer> subDirList = new ArrayList<Integer>();

  // 날짜를 출력하기 위한 형식 설정
  SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd a hh:mm");
  }

  for (int i = 0; i < files.length; i++) {
    String attr = ""; // 파일의 속성(R, W, H, 디렉토리 구분)
    String size = ""; // 파일의 크기

    if (files[i].isDirectory()) {
      attr = "<DIR>";
      subDirList.add(i); // 인덱스를 List에 추가
      // File[]의 i번째 있는 디렉토리들을 추후에 출력하기 위해서
    } else {
      size = files[i].length() + ""; // 사이즈값 문자열화
      attr = files[i].canRead() ? "R" : " ";
      attr = files[i].canWrite() ? "W" : " ";
      attr = files[i].isHidden() ? "H" : " ";
    }

  System.out.printf("%s %5s %12s %s\n" // 포맷스트링: 출력 예쁘게
      , sdf.format(new Date(files[i].lastModified())) // %s
      , attr // %5s: 문자열 사이즈를 5글자로 고정(양수: 오른쪽 정렬)
      , size // %12s
      , files[i].getName()); //%s\n, 파일명 출력
  }

  int dirCount = subDirList.size(); // 폴더 안의 하위폴더 개수
  int fileCount = files.length - dirCount; // 폴더 안의 파일 개수

  System.out.println(fileCount + "개의 파일, " + dirCount + "개의 디렉토리");
  System.out.println();

  for (int i = 0; i < subDirList.size(); i++) {
    // 하위폴더의 내용도 출력하기 위해 현재 메서드를 재귀 호출
    displayFileList(files[subDirList.get(i)]);
  }
}
profile
갈 길이 멀다

0개의 댓글