반응형

- 특정 디렉토리 파일 목록 가져오기 -


Java에서 File 클래스를 사용해 특정 경로의 파일 리스트를 가져오는 방법에 대해 알아보자.

File 클래스가 기본적으로 제공해주는 함수이다.

- list() : 디렉토리에 있는 파일들의 이름 목록을 반환

- list(FilenameFilter filter) : 디렉토리에 있는 파일들의 이름을 필터링한 이름 목록을 반환

- listFiles() : 디렉토리에 있는 파일 목록을 반환

- listFiles(FileFilter filter) : 디렉토리에 있는 파일들을 필터링한 파일 목록을 반환

- listFiles(FilenameFilter filter) : 디렉토리에 있는 파일들의 이름을 필터링한 파일 목록을 반환


코드로 살펴보기에 앞서 접근하기에 앞서 현재 파일구조에 대해 설명하자면

 

이런식으로 구성되어있다는 것을 기준으로 코드를 살펴보자.

 

1. 파일 이름 목록 반환 - list()

String DATA_DIRECTORY = "c:/mine_data/";
File dir = new File(DATA_DIRECTORY);

String[] filenames = dir.list();
for (String filename : filenames) {
	System.out.println("filename : " + filename);
}

▷결과

filename : it
filename : mine.txt
filename : mine_it.zip
filename : record

 

list() 함수는 해당 경로의 파일 목록을 가져오는데 이름만 가져오는것이다.

그래서 String[] 로 return 되는 것이다.

 

2. 필터링된 파일 이름 목록 반환 - list(FilenameFilter filter)

String DATA_DIRECTORY = "c:/mine_data/";
File dir = new File(DATA_DIRECTORY);

FilenameFilter filter = new FilenameFilter() {
  public boolean accept(File f, String name) {
  	//파일 이름에 "mine"가 붙은것들만 필터링
  	return name.contains("mine");
  }
};

String[] filenames = dir.list(filter);
for (String filename : filenames) {
	System.out.println("filename : " + filename);
}

▷결과

filename : mine.txt
filename : mine_it.zip

 

FilenameFilter를 통해 필터링을 하는데 파일을 탐색할 때마다 accept(File f, String name)가 호출된다.여기서 File f는 파일의 부모 디렉토리, 즉 위 예제 코드에서는 "c:/mine_data"를 의미한다.

 

그리고 name은 말그대로 파일 이름을 의미하기때문에 이 name을 가지고 조건을 걸어주어 필터링 시켜주면 된다.

 

3. 파일 목록 반환 - listFiles()

String DATA_DIRECTORY = "c:/mine_data/";
File dir = new File(DATA_DIRECTORY);

File files[] = dir.listFiles();
for (File file : files) {
	System.out.println("file : " + file);
}

▷결과

file : c:\mine_data\it
file : c:\mine_data\mine.txt
file : c:\mine_data\mine_it.zip
file : c:\mine_data\record

 

listFiles() 함수는 파일 목록을 가져오는거라 해당 디렉토리의 하위 파일 목록을 가져오는것이다.

해당 경로의 하위 파일들만 가져오기때문에 하위 폴더 안에있는 또다른 파일 목록들을 가져오고 싶다면 추가적인 코딩이 필요하다.

 

4. 필터링된 파일 목록 반환(1) - listFiles(FileFilter filter)

String DATA_DIRECTORY = "c:/mine_data/";
File dir = new File(DATA_DIRECTORY);

FileFilter filter = new FileFilter() {
	public boolean accept(File f) {
		return f.getName().endsWith("zip");
	}
};
        
File files[] = dir.listFiles(filter);
for (File file : files) {
	System.out.println("file : " + file);
}

▷결과

file : c:\mine_data\mine_it.zip

 

FilenameFilter 와 마찬가지로 파일마다 accept가 실행되는데 FilenameFilter 에서의 File이 의미하는건 부모 경로라고 한다면

FileFilter 에서의 File은 해당 File을 그대로 의미하기때문에 위 코드처럼 File이 가지는 속성을 가지고 필터링이 가능하다.

 

5. 필터링된 파일 목록 반환(2) - listFiles(FilenameFilter filter)

String DATA_DIRECTORY = "c:/mine_data/";
File dir = new File(DATA_DIRECTORY);

FilenameFilter filter= new FilenameFilter() {
  public boolean accept(File f, String name) {
  	return name.contains("mine");
  }
};
        
File files[] = dir.listFiles(filter);
for (File file : files) {
	System.out.println("file : " + file);
}

▷결과

file : c:\mine_data\mine.txt
file : c:\mine_data\mine_it.zip

 

list() 에서 사용한 FilenameFilter와 동일하게 작동한다.

 

반응형