Java 현재 폴더주소 가져오는 방법

현재 작업 폴더 확인

System.getProperty("user.dir") 을 통해 현재 작업 폴더 경로 값을 가져올 수 있다.

가져온 폴더 경로 값을 이용해 해당 폴더 내에 있는 파일과 폴더들을 배열로 반환할 수 있다.

💻 Java 예제 1

📝 소스 코드

import java.io.File;

public class Main {

	public static void main(String[] args) {
		System.out.println("디렉터리 정보 확인\n");

		String curWorkingDir = System.getProperty("user.dir");
		System.out.println("현재 작업 폴더 : " + curWorkingDir);		
		System.out.println();
        
		// 현재 작업 디렉터리의 파일 리스트 출력
		File curDir = new File(curWorkingDir); // 현재 작업 디렉터리 객체
		File[] list = curDir.listFiles();
		
		for (int i = 0; i < list.length; i++) {
			if (list[i].isDirectory())
				System.out.print("DIR" + "\t");
			else
				System.out.print("FILE" + "\t");
			
			System.out.print(list[i].getName() + "\t");
			System.out.println(list[i].length());
     	   	}
            
            	System.out.println();
            	System.out.println();
            	System.out.println("상대 경로 이용한 디렉터리 정보 확인\n");
            	File tempDir = new File("temp");	// 상대 경로 이용한 파일 객체 생성
            
            	File[] list2 = tempDir.listFiles();
            	for (File f : list2) {
            		if (f.isFile())
                		System.out.print("FILE" + "\t");
                	else
	                	System.out.print("DIR" + "\t");
                    
    	        	System.out.print(f.getName() + "\t");
                    	System.out.println(f.length());
		}
	}
}

현재 작업 폴더 경로 값을 curWorkingDir 변수에 저장하였다.

해당 변수를 이용해 new File()을 하면 현재 작업 디렉터리 객체를 생성할 수 있다.

listFiles() 메소드는 디렉터리 안에 있는 파일과 디렉터리들을 배열로 반환한다.

배열로 반환한 값을 File[] list에 저장하였다.

getName()을 사용하면 현재 작업 폴더 내에 있는 디렉터리와 파일 이름들을 가져올 수 있다.

length()는 파일의 크기(byte)를 반환한다. 디렉터리의 경우 length 값이 의미가 없다.

아래 실행 결과를 보면 현재 작업 폴더 밑에 temp 폴더가 있는 걸 확인할 수 있다.

따라서 new File("temp")로 상대 경로를 이용해 파일 객체를 생성해보았다.

getAbsolutePath() 메소드를 이용해 파일 객체의 절대 경로를 가져올 수 있다.

📄 실행 결과

Java 현재 폴더주소 가져오는 방법

경로 확인

💻 Java 예제 2

📝 소스 코드

import java.io.File;

public class Main {

	public static void main(String[] args) {
    	String path = "dummy.txt";
	File f = new File(path);	// 상대 경로
		
	System.out.println("파일 이름(상대 경로) : " + f.getName());	// 상대 경로 이름
	System.out.println("절대 경로 : " + f.getAbsolutePath());	// 절대 경로
	System.out.println("파일 존재? " + f.exists());	// 물리적으로 존재하는지 여부
    }
}

📄 실행 결과

Java 현재 폴더주소 가져오는 방법

앞서 File tempDir = new File("temp") 를 한 것처럼 dummy.txt 파일도 상대 경로를 이용해 파일 객체를 생성하였다.

getName() 메소드를 통해 상대 경로 이름을 가져올 수 있다.

exists() 메소드를 이용해 물리적으로 존재하는지의 여부를 알 수 있는데, Java 예제 1의 실행 결과에서 보듯이 현재 폴더 내에 dummy.txt 파일은 존재하지 않으므로 false가 반환된다.

자바 애플리케이션은 resource 디렉토리에 정적 파일을 저장합니다.

이 때 파일의 경로를 알기 위해서는 resource 디렉토리의 경로가 필요합니다.

이 때 resource 디렉토리의 경로를 가져오기 위해 ClassLoader를 활용합니다.

꼭 클래스 로더에 대한 지식이 필요하진 않습니다. 다만 궁금하신 분은 이 글을 읽어주세요!


resource 디렉토리의 경로 가져오기

resource의 디렉토리를 가져오기 위해 ClassLoader에 있는 getResource() 메소드를 사용합니다.

public URL getResource(String name)

이 메소드는 주어진 이름을 가진 자원을 찾으려고 시도합니다.

먼저 리소스의 상위 클래스 로더에 위임합니다. 부모가 null 이면 가상 머신에 빌드된 클래스 로더의 경로를 검색합니다.

실패하면 메서드는 findResource(String)  호출 하여 리소스를 찾습니다. 입력으로 지정된 리소스 이름은 classpath에 대해 상대적이거나 절대적일 수 있습니다.

리소스를 읽기 위한 URL 개체를 반환하거나 리소스를 찾을 수 없거나 호출자가 리소스를 반환할 수 있는 적절한 권한이 없는 경우 null을 반환합니다.

Java는 클래스 경로에서 리소스를 로드한다는 점에 유의하는 것이 중요합니다.

마지막으로 Java에서 리소스 로드 는 환경이 리소스를 찾도록 설정되어 있는 한 코드가 실행되는 위치가 중요하지 않기 때문에 위치가 독립적인 것으로 간주됩니다. 즉 Java 환경이 리소스를 찾도록 설정되어 있다면 어느 위치에서 실행하든 위치와 관계없이 실행됩니다. 

따라서 resource의 디렉토리 경로를 가져오기 위해서는 다음과 같이 할 수 있습니다.

URL resource = getClass().getClassLoader().getResource("리소스 이름");
String filePath = resource.getFile();

파일의 내용 읽기

리소스의 경로를 알아냈다면 파일의 내용을 읽을 수 있습니다.

URL resource = getClass().getClassLoader().getResource("리소스 이름") 로 리소스의 경로를 가져왔습니다.

Path path = new File(resource.getPath()).toPath();

List<String> contents = Files.readAllLines(path);

이렇게 진행하시면 파일 안에있는 모든 라인을 읽습니다. 단 Files.readAllLines() 메서드 내부적으로 UTF-8 로 디코딩을 진행합니다.