개발 공부/Java & Spring

27. File

빵다희 2023. 4. 17. 22:14
File
 : 파일은 가장 많이 사용되는 입출력 대상이다.
 자바에서는 File클래스를 통해서 파일과 디렉토리를 다룬다.
 그래서 File 인스턴스는 파일 일 수도 있고 디렉토리일 수도 있다. 

💡File의 생성자와 메소드

생성자 / 메서드 설 명
File(String fileName) 주어진 문자열(fileName)을 이름으로 갖는 파일을 위한 File인스턴스를 생성한다.
파일 뿐만 아니라 디렉토리도 같은 방법으로 다룬다.
여기서 fileName은 주로 경로(path)를 포함해서 지정해주지만, 파일 이름만 사용해도 되는데 이 경우 프로그램이 실행되는 위치가 경로(path)로 간주된다. 
File(String pathName, String fileName)
File(File     pathName, String fileName)
파일의 경로와 이름을 따로 분리해서 지정할 수 있도록 한 생성자.
이 중 두 번째 것은 경로를 문자열이 아닌 File인스턴스인 경우를 위해서 제공된 것이다. 
File(URI uri) 지정된 uri로 파일을 생성
String getName() 파일이름을 String으로 반환
String getPath() 파일의 경로(path)를 String으로 반환
String getAbsolutePath()
File getAbsoluteFile()
파일의 절대경로를 String으로 반환
파일의 절대경로를 File로 반환
String getParent()
File getParentFile()
파일의 조상 디렉토리를 String으로 반환
파일의 조상 디렉토리를 File로 반환
String getCanonicalPath()
File getCanonicalFile()
파일의 정규경로를 String으로 반환
파일의 정규경로를 File로 반환.

💡경로와 관련된 File의 멤버변수

멤버변수 설 명
static String pathSeperator OS에서 사용하는 경로(path) 구분자. 왼도우 ";" , 유닉스 ":"
static char pathSeparatorChar OS에서 사용하는 경로(path) 구분자.
윈도우에서는 ";". 유닉스 ":"
static String separator OS에서 사용하는 이름 구분자. 윈도우 "\", 유닉스 "|"
static String separatorChar OS에서 사용하는 이름 구분자. 윈도우 "\", 유닉스 "|"

- 위 표에서 알 수 있듯이 파일의 경로와 디렉토리나 파일의 이름을 구분하는 데 사용되는 구분자가 OS마다 다를 수 있기 때문에, OS독립적으로 프로그램을 작성하기 위해서는 반드시 위 표의 변수들을 이용해야한다.

만일 윈도우에서 사용하는 구분자를 코드를 직접 적어 놓았다면, 이 코드는 다른 OS에서는 오류를 일으킬 수 있다.

 

💡 파일의 경로

✔️ 절대경로 (absolute path) : 파일시스템의 루트(root)로부터 시작하는 파일의 전체경로를 의미한다.
OS에 따라 다르지만, 하나의 파일에 대해 둘 이상의 절대경로가 존재할 수 있다.
현재 디렉토리를 의미하는 '.'와 같은 기호나 링크를 포함하고 있는 경우가 이에 해당한다.
예를 들어 'C:\jdk1.8\work\ch15\FileEx1.java'의 또 다른 절대 경로는 'C:\jdk1.8\work\ch15\.\FileEx1.java'가 있다.

✔️정규경로(canonical path) : 정규경로는 기호나 링크 등을 포함하지 않는 유일한 경로를 의미한다.
절대 경로는 둘 이상일 수 있지만 정규경로는 단 하나 뿐이다. 
예를 들어 'C:\jdk1.8\work\ch15\FileEx1.java'의 정규경로는 'C:\jdk1.8\work\ch15\FileEx1.java' 한 개 뿐이다. 

✔️시스템 속성 중에서 user.dir의 값을 확인하면 현재 프로그램이 실행 중인 디렉토리를 알 수 있다. 
✔️JDK1.2이후 부터는 JDK설치 이후에 classpath를 따로 지정해주지 않아도 sun.boot.class.path라는 시스템 속성에 기본적인 classpath가 있어서 기본적인 경로들은 이미 설정되어 있다.

💡File 클래스 사용시 주의할 점

File인스턴스를 생성했다고 해서 파일의 디렉토리가 생성되는 것은 아니다.
파일명이나 디렉토리명으로 지정된 문자열이 유효하지 않더라도 컴파일 에러나 예외를 발생시키지않는다.
새로운 파일을 생성하기 위해서는 File인스턴스를 생성한 다음, 출력스트림을 생성하거나 createNewFile()을 호출해야한다.

💡파일 생성 예시 

// 1. 이미 존재하는 파일을 참조할 때 :
File f = new File("c:\\jdk1.8\\work\\ch15", "FileEx1.java");

// 2. 기존에 없는 파일을 새로 생성할 때 
File f = new File("c:\\jdk1.8\\work\\ch15", "NewFile.java");
f.createNewFile();     // 새로운 파일이 생성된다.

 

💡File의 메소드들 (Java SE & JDK 20)

https://docs.oracle.com/en/java/javase/20/docs/api/java.base/java/io/File.html#method-summary

 

File (Java SE 20 & JDK 20)

All Implemented Interfaces: Serializable, Comparable An abstract representation of file and directory pathnames. User interfaces and operating systems use system-dependent pathname strings to name files and directories. This class presents an abstract, sys

docs.oracle.com

💡선택한 디렉토리(폴더)에 포함된 파일과 디렉토리의 목록을 보여주는 예제 

import java.io.File;

public class FileEx2 {
    public static void main(String[] args) {
        if(args.length != 1){
            System.out.println("USAGE : java FileEx2 DIRECTORY");
            System.exit(0);
        }
        File f = new File(args[0]);

        if(!f.exists() || !f.isDirectory()){
            System.out.println("유효하지 않은 디렉토리입니다.");
            System.exit(0);
        }
        File[] files = f.listFiles();
        for(int i = 0; i < files.length; i ++){
            String fileName = files[i].getName();
            System.out.println(files[i].isDirectory() ? "["+fileName+"]" : fileName);
        }
    }
}
- 실행결과 -
user@user src % java FileEx2.java
USAGE : java FileEx2 DIRECTORY
user@user src % java FileEx2.java work
유효하지 않은 디렉토리입니다.
user@user src % java FileEx2.java /Users/user/Documents/workspace/theStandardOfJAVA
[out]
theStandardOfJAVA.iml
[.idea]
[src]
728x90
반응형