Java / / 2022. 7. 15. 09:33

[Java] File Class - 특정 디렉토리 파일 목록 가져오기 (list/listFiles)

반응형

 

File Class

Java에서 File 클래스를 사용해 특정 경로의 파일 리스트를 가져올 수 있다.

Map<String, Integer> fileMap = Maps.newHashMap();
File dir = new File(baseUploadPath + "/" + place.getId());
if(!dir.exists())
    dir.mkdirs();
String[] allFiles = dir.list();
for(String fileName : allFiles)
    fileMap.put(fileName, 0);

 

 

File class 제공 함수

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

▶ Iist()

디렉토리에 있는 파일들의 이름 목록을 반환한다.

 

▶ Iist(FilenameFilter filter)

디렉토리에 있는 파일들의 이름을 필터링한 이름 목록을 반환한다.

 

▶ IistFiles()

디렉토리에 있는 파일 목록을 반환한다.

 

▶ IistFiles(FileFilter filter)

디렉토리에 있는 파일들을 필터링한 파일 목록을 반환한다.

 

▶ IistFiles(FilenameFilter filter)

디렉토리에 있는 파일들의 이름을 필터링한 파일 목록을 반환한다.

 

▶ isDirectory

특정 디렉토리만 걸러낸다.

 

 

 

 


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와 동일하게 작동한다.

출처: https://mine-it-record.tistory.com/432 [나만의 기록들:티스토리]

 

6. 특정 디렉토리 및 파일 여부 체크 - isDirectory()

디렉토리를 검색할 필요가 있을 경우에 다음 코드가 유용할 것 같다.

  File file = new File(path);
  File[] files = file.listFiles();
  if (files == null)
   return false;
   
  for(int i = 0;i < files.length;i++) {   
   if(files[i].isDirectory()) {
    Log.v("Directory : ", files[i].getName());    
   } else {
    Log.v("File :", files[i].getName());    
   }
  }

path를 이용하여 디렉토리를 열고, listFiles() 메서드를 이용해서 디렉토리의 서브 디렉토리와 파일 목록을 얻을 수 있다.

디렉토리, 파일 여부를 체크하는 것은 isDirectory() 메서드를 이용할 수 있다.

 

7. 파일 명 체크 - getName()

파일명은 getName()을 이용한다.

 

만약 특정 확장자로 된 파일만 걸러내고 싶으면, FileFilter 기능을 이용하여 디렉토리만 걸러내고 싶으면 다음과 같이 구현할 수 있다.

  FileFilter fileFilter = new FileFilter() {
   public boolean accept(File file) {
    return file.isDirectory();
   }
  };

  File file = new File(path);
  File[] files = file.listFiles(fileFilter);
  if (files == null)
   return false;
   
  for(int i = 0;i < files.length;i++) {   
   if(files[i].isDirectory()) {
    Log.v("Directory : ", files[i].getName());    
   } else {

    Log.v("File :", files[i].getName());    

   }
  }
반응형
  • 네이버 블로그 공유
  • 네이버 밴드 공유
  • 페이스북 공유
  • 카카오스토리 공유