특정 directory의 File list를 출력하는 방법을 소개합니다.
Java의 File 클래스는 다음 API들을 제공합니다.
listFiles()
: 디렉토리 경로에 있는 파일들을 배열로 리턴listFiles(FilenameFilter filter)
: 디렉토리 경로에 있는 파일들을 필터링하고 그 결과를 배열로 리턴listFiles(FileFilter filter)
: 디렉토리 경로에 있는 파일들을 필터링하고 그 결과를 배열로 리턴list()
: 디렉토리 경로에 있는 파일들의 이름들을 배열로 리턴list(FilenameFilter filter)
: 디렉토리 경로에 있는 파일들의 이름들을 필터링하고 그 결과를 배열로 리턴
탐색할 디렉토리는 저의 로컬 폴더 /home/mjs/test/test
이며, 이 경로의 파일 구조는 다음과 같습니다.
.
├── file1.txt
├── folder1
│ └── file2.txt
├── folder2
│ ├── file3.txt
│ └── file4.txt
├── folder3
│ ├── file5.txt
│ ├── file6.txt
│ └── folder4
│ ├── text2.txt
│ ├── text3.txt
│ └── text.txt
└── myscript.sh
파일 리스트 출력(listFiles)
listFiles()
는 파일 바로 아래에 있는 file list를 배열로 리턴해 줍니다.
하지만, 재귀적으로 모든 하위 폴더들의 파일들은 가져오지 않습니다.
다음 코드를 실행하면 /home/mjs/test/test
하위의 파일들을 출력합니다.
File dir = new File("/home/mjs/test/test");
File files[] = dir.listFiles();
for (int i = 0; i < files.length; i++) {
System.out.println("file: " + files[i]);
}
결과
file: /home/mjs/test/test/folder1
file: /home/mjs/test/test/file1.txt
file: /home/mjs/test/test/myscript.sh
file: /home/mjs/test/test/folder3
file: /home/mjs/test/test/folder2
파일 리스트 출력 (Recursive, listFiles)
재귀적으로 listFiles()
를 호출하여 하위 폴더들의 파일들도 모두 출력하도록 할 수 있습니다.
다음 코드는 /home/mjs/test/test
하위의 모든 파일들을 출력합니다.
System.out.println("2");
showFilesInDIr("/home/mjs/test/test");
public static void showFilesInDIr(String dirPath) {
File dir = new File(dirPath);
File files[] = dir.listFiles();
for (int i = 0; i < files.length; i++) {
File file = files[i];
if (file.isDirectory()) {
showFilesInDIr(file.getPath());
} else {
System.out.println("file: " + file);
}
}
}
결과
file: /home/mjs/test/test/folder1/file2.txt
file: /home/mjs/test/test/file1.txt
file: /home/mjs/test/test/myscript.sh
file: /home/mjs/test/test/folder3/file5.txt
file: /home/mjs/test/test/folder3/folder4/text3.txt
file: /home/mjs/test/test/folder3/folder4/text2.txt
file: /home/mjs/test/test/folder3/folder4/text.txt
file: /home/mjs/test/test/folder3/file6.txt
file: /home/mjs/test/test/folder2/file3.txt
file: /home/mjs/test/test/folder2/file4.txt
파일 리스트 출력(listFiles(FilenameFilter))
listFiles(FilenameFilter)
를 이용하면 특정 조건으로 파일을 필터링한 결과를 출력할 수 있습니다.
아래 코드는 "file"로 시작하는 파일만 필터링하여 결과로 리턴하는 코드입니다.
File dir = new File("/home/mjs/test/test");
FilenameFilter filter = new FilenameFilter() {
public boolean accept(File f, String name) {
return name.startsWith("file");
}
};
File files[] = dir.listFiles(filter);
for (int i = 0; i < files.length; i++) {
System.out.println("file: " + files[i]);
}
파일을 탐색할 때마다 accept(File f, String name)
가 호출되며, 여기서 File f
는 파일의 부모 디렉토리입니다. 즉, /home/mjs/test/test
를 의미합니다.
String name
은 파일의 이름입니다.
결과
file: /home/mjs/test/test/file1.txt
파일 리스트 출력(listFiles(FileFilter))
FilenameFilter는 파일의 이름을 인자로 전달받고 이름으로만 필터링을 해야 합니다.
만약 File을 받고 싶다면 listFiles(FileFilter)
를 사용해야 합니다.
다음은 listFiles(FileFilter)
로 필터링을 하는 코드입니다.
File dir = new File("/home/mjs/test/test");
FileFilter filter = new FileFilter() {
public boolean accept(File f) {
return f.getName().endsWith("txt");
}
};
File files[] = dir.listFiles(filter);
for (int i = 0; i < files.length; i++) {
System.out.println("file: " + files[i]);
}
결과
file: /home/mjs/test/test/file1.txt
파일 리스트 출력(Recursive, Filtering)
이번 예제는 재귀적으로 하위 모든 폴더를 탐색하고 특정 조건의 파일만 찾으려고 합니다.
listFiles()
만 이용하였고, 필터링 조건은 FilenameFilter 등의 인자로 전달하지 않고 직접 구현하였습니다.
FileFilter filter = f -> f.getName().endsWith("txt");
showFilesInDIr2("/home/mjs/test/test");
public static void showFilesInDIr2(String dirPath) {
File dir = new File(dirPath);
File files[] = dir.listFiles();
for (int i = 0; i < files.length; i++) {
File file = files[i];
if (file.isDirectory()) {
showFilesInDIr(file.getPath());
} else if (file.getName().endsWith(".txt")){
System.out.println("file: " + file);
}
}
}
결과를 보면 .txt
로 끝나는 모든 파일들이 출력되었습니다.
file: /home/mjs/test/test/folder1/file2.txt
file: /home/mjs/test/test/file1.txt
file: /home/mjs/test/test/folder3/file5.txt
file: /home/mjs/test/test/folder3/folder4/text3.txt
file: /home/mjs/test/test/folder3/folder4/text2.txt
file: /home/mjs/test/test/folder3/folder4/text.txt
file: /home/mjs/test/test/folder3/file6.txt
file: /home/mjs/test/test/folder2/file3.txt
file: /home/mjs/test/test/folder2/file4.txt
파일 리스트 출력(파일 이름만)
list()
는 하위 경로의 파일 이름들을 배열로 리턴해 줍니다.
File 객체가 필요없고 파일 이름만 String으로 필요하다면 이 API를 사용하면 됩니다.
File dir = new File("/home/mjs/test/test");
String[] filenames = dir.list();
for (int i = 0; i < filenames.length; i++) {
System.out.println("file: " + filenames[i]);
}
결과
file: folder1
file: file1.txt
file: myscript.sh
file: folder3
file: folder2
파일 리스트 출력(파일 이름만, Filtering)
list(FilenameFilter filter)
는 특정 조건으로 파일 이름을 필터링하고 그 결과를 배열로 리턴합니다.
File dir = new File("/home/mjs/test/test");
String[] filenames = dir.list((f,name)->name.endsWith(".txt"));
for (int i = 0; i < filenames.length; i++) {
System.out.println("file: " + filenames[i]);
}
결과
file: file1.txt
참고
Recommended Posts:
- Java - 간단한 HashTable 구현
- Java - 제곱근(root) 계산, Math.sqrt()
- Java - 문자열(String)을 비교하는 방법 (==, equals, compare)
- Java - 대소문자 변환 & 구분없이 비교 (toUpperCase, toLowerCase, equalsIgnoreCase)
- Java - System.identityHashCode()와 hashCode()의 차이점
- Java - 거듭제곱 계산, Math.pow()
- Java - Random number(난수) 생성하는 방법
- Java - 문자열(String) 길이 계산
- Java - Thread 생성, 실행, 정지하는 방법
- Java - 배열 정렬(Sorting) (오름차순, 내림차순)
- Java - String.matches()로 문자열 패턴 확인 및 다양한 예제 소개
- Java - 두개의 List를 하나로 합치는 방법
- Java - Map을 정렬(sorting)하는 다양한 방법