특정 directory의 File list를 출력하는 방법을 소개합니다.
Java의 File 클래스는 다음 API들을 제공합니다.
listFiles()
: 디렉토리 경로에 있는 파일들을 배열로 리턴listFiles(FilenameFilter filter)
: 디렉토리 경로에 있는 파일들을 필터링하고 그 결과를 배열로 리턴listFiles(FileFilter filter)
: 디렉토리 경로에 있는 파일들을 필터링하고 그 결과를 배열로 리턴list()
: 디렉토리 경로에 있는 파일들의 이름들을 배열로 리턴list(FilenameFilter filter)
: 디렉토리 경로에 있는 파일들의 이름들을 필터링하고 그 결과를 배열로 리턴
탐색할 디렉토리는 저의 로컬 폴더 /home/js/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/js/test/test
하위의 파일들을 출력합니다.
File dir = new File("/home/js/test/test");
File files[] = dir.listFiles();
for (int i = 0; i < files.length; i++) {
System.out.println("file: " + files[i]);
}
결과
file: /home/js/test/test/folder1
file: /home/js/test/test/file1.txt
file: /home/js/test/test/myscript.sh
file: /home/js/test/test/folder3
file: /home/js/test/test/folder2
파일 리스트 출력 (Recursive, listFiles)
재귀적으로 listFiles()
를 호출하여 하위 폴더들의 파일들도 모두 출력하도록 할 수 있습니다.
다음 코드는 /home/js/test/test
하위의 모든 파일들을 출력합니다.
System.out.println("2");
showFilesInDIr("/home/js/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/js/test/test/folder1/file2.txt
file: /home/js/test/test/file1.txt
file: /home/js/test/test/myscript.sh
file: /home/js/test/test/folder3/file5.txt
file: /home/js/test/test/folder3/folder4/text3.txt
file: /home/js/test/test/folder3/folder4/text2.txt
file: /home/js/test/test/folder3/folder4/text.txt
file: /home/js/test/test/folder3/file6.txt
file: /home/js/test/test/folder2/file3.txt
file: /home/js/test/test/folder2/file4.txt
파일 리스트 출력(listFiles(FilenameFilter))
listFiles(FilenameFilter)
를 이용하면 특정 조건으로 파일을 필터링한 결과를 출력할 수 있습니다.
아래 코드는 "file"로 시작하는 파일만 필터링하여 결과로 리턴하는 코드입니다.
File dir = new File("/home/js/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/js/test/test
를 의미합니다.
String name
은 파일의 이름입니다.
결과
file: /home/js/test/test/file1.txt
파일 리스트 출력(listFiles(FileFilter))
FilenameFilter는 파일의 이름을 인자로 전달받고 이름으로만 필터링을 해야 합니다.
만약 File을 받고 싶다면 listFiles(FileFilter)
를 사용해야 합니다.
다음은 listFiles(FileFilter)
로 필터링을 하는 코드입니다.
File dir = new File("/home/js/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/js/test/test/file1.txt
파일 리스트 출력(Recursive, Filtering)
이번 예제는 재귀적으로 하위 모든 폴더를 탐색하고 특정 조건의 파일만 찾으려고 합니다.
listFiles()
만 이용하였고, 필터링 조건은 FilenameFilter 등의 인자로 전달하지 않고 직접 구현하였습니다.
FileFilter filter = f -> f.getName().endsWith("txt");
showFilesInDIr2("/home/js/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/js/test/test/folder1/file2.txt
file: /home/js/test/test/file1.txt
file: /home/js/test/test/folder3/file5.txt
file: /home/js/test/test/folder3/folder4/text3.txt
file: /home/js/test/test/folder3/folder4/text2.txt
file: /home/js/test/test/folder3/folder4/text.txt
file: /home/js/test/test/folder3/file6.txt
file: /home/js/test/test/folder2/file3.txt
file: /home/js/test/test/folder2/file4.txt
파일 리스트 출력(파일 이름만)
list()
는 하위 경로의 파일 이름들을 배열로 리턴해 줍니다.
File 객체가 필요없고 파일 이름만 String으로 필요하다면 이 API를 사용하면 됩니다.
File dir = new File("/home/js/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/js/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
참고
Related Posts
- Java - Unsupported class file major version 61 에러
- Java - String.matches()로 문자열 패턴 확인 및 다양한 예제 소개
- Java - 문자열 공백제거 (trim, replace)
- Java - replace()와 replaceAll()의 차이점
- Java - ArrayList 초기화, 4가지 방법
- Java - 배열 정렬(Sorting) (오름차순, 내림차순)
- Java - 문자열(String)을 비교하는 방법 (==, equals, compare)
- Java - StringBuilder 사용 방법, 예제
- Java - 로그 출력, 파일 저장 방법 (Logger 라이브러리)
- Java IllegalArgumentException 의미, 발생 이유
- Java - NullPointerException 원인, 해결 방법
- Seleninum의 ConnectionFailedException: Unable to establish websocket connection 해결
- Java - compareTo(), 객체 크기 비교
- Java - BufferedWriter로 파일 쓰기
- Java - BufferedReader로 파일 읽기
- Java charAt() 함수 알아보기
- Java - BigInteger 범위, 비교, 연산, 형변환
- Java contains()로 문자(대소문자 X) 포함 확인
- Java - Set(HashSet)를 배열로 변환
- Java - 문자열 첫번째 문자, 마지막 문자 확인
- Java - 문자열 한글자씩 자르기
- Java - 문자열 단어 개수 가져오기
- Java - 1초마다 반복 실행
- Java - 배열을 Set(HashSet)로 변환
- Java - 여러 Set(HashSet) 합치기
- Java - 명령행 인자 입력 받기
- Java - 리스트 역순으로 순회, 3가지 방법
- Java - 특정 조건으로 리스트 필터링, 3가지 방법
- Java - HashMap 모든 요소들의 합계, 평균 계산
- Java - 특정 조건으로 HashMap 필터링
- Java - 싱글톤(Singleton) 패턴 구현
- Java - 숫자 왼쪽에 0으로 채우기
- Java - String 배열 초기화 방법
- Java - 정렬된 순서로 Map(HashMap) 순회
- Java - HashMap에서 key, value 가져오기