1. 개요
java.io.File 클래스는 파일이나 디렉터리 경로의 추상적 표현입니다. 주로 파일 및 디렉터리의 생성, 검색, 삭제 작업에 사용됩니다.
2. 생성자
File 클래스는 세 가지 주요 생성자를 제공합니다:
public File(String pathname): 주어진 경로 문자열을 추상 경로로 변환하여 File 객체 생성public File(String parent, String child): 부모 경로와 자식 경로 문자열로 File 객체 생성public File(File parent, String child): 부모 File 객체와 자식 경로 문자열로 File 객체 생성
예제 코드:
// 경로 문자열
String path = "D:\\aaa.txt";
File f1 = new File(path);
// 부모/자식 문자열
String parent = "d:\\aaa";
String child = "bbb.txt";
File f2 = new File(parent, child);
// 부모 File 객체 + 자식 문자열
File parentDir = new File("d:\\aaa");
String child2 = "bbb.txt";
File f3 = new File(parentDir, child2);
참고: File 객체는 실제 디스크에 파일/디렉터리가 존재하는지 여부와 관계없이 생성됩니다.
3. 주요 메서드
3.1 정보 조회 메서드
public String getAbsolutePath(): 절대 경로 반환public String getPath(): 생성자에 사용된 경로 반환public String getName(): 파일 또는 디렉터리 이름 반환public long length(): 파일 크기(바이트) 반환
예제:
File f = new File("d:/aaa/bbb.java");
System.out.println("절대 경로: " + f.getAbsolutePath());
System.out.println("생성 경로: " + f.getPath());
System.out.println("이름: " + f.getName());
System.out.println("크기: " + f.length() + " 바이트");
File dir = new File("d:/aaa");
System.out.println("디렉터리 절대 경로: " + dir.getAbsolutePath());
System.out.println("디렉터리 이름: " + dir.getName());
출력:
절대 경로: d:\aaa\bbb.java
생성 경로: d:\aaa\bbb.java
이름: bbb.java
크기: 636 바이트
디렉터리 절대 경로: d:\aaa
디렉터리 이름: aaa
참고: length()는 디렉터리에 대해 사용할 경우 반환값이 정의되지 않습니다.
3.2 절대 경로와 상대 경로
- 절대 경로: 드라이브 문자부터 시작하는 완전한 경로 (예:
D:\bbb.java) - 상대 경로: 현재 프로젝트 디렉터리를 기준으로 하는 경로 (예:
bbb.java)
File f1 = new File("D:\\bbb.java");
System.out.println(f1.getAbsolutePath()); // D:\bbb.java
File f2 = new File("bbb.java");
System.out.println(f2.getAbsolutePath()); // D:\idea_project_test4\bbb.java
3.3 확인 메서드
public boolean exists(): 파일/디렉터리 존재 여부public boolean isDirectory(): 디렉터리인지 확인public boolean isFile(): 파일인지 확인
File f = new File("d:\\aaa\\bbb.java");
File d = new File("d:\\aaa");
System.out.println("파일 존재: " + f.exists());
System.out.println("디렉터리 존재: " + d.exists());
System.out.println("디렉터리 여부: " + d.isDirectory());
System.out.println("파일 여부: " + d.isFile());
파일 존재: true
디렉터리 존재: true
디렉터리 여부: true
파일 여부: false
3.4 생성 및 삭제 메서드
public boolean createNewFile(): 새로운 빈 파일 생성 (존재하지 않을 때만)public boolean delete(): 파일 또는 디렉터리 삭제public boolean mkdir(): 디렉터리 생성public boolean mkdirs(): 상위 디렉터리 포함하여 디렉터리 생성
// 파일 생성
File f1 = new File("aaa.txt");
System.out.println("생성 전 존재: " + f1.exists()); // false
System.out.println("생성 성공: " + f1.createNewFile()); // true
System.out.println("생성 후 존재: " + f1.exists()); // true
// 단일 디렉터리
File d1 = new File("newDir");
System.out.println("디렉터리 생성: " + d1.mkdir()); // true
// 다중 디렉터리
File d2 = new File("newDira\\newDirb");
System.out.println("mkdir 실패: " + d2.mkdir()); // false (상위 없음)
System.out.println("mkdirs 성공: " + d2.mkdirs()); // true
// 삭제
System.out.println("파일 삭제: " + f1.delete()); // true
System.out.println("디렉터리 삭제: " + d1.delete()); // true
System.out.println("다중 디렉터리 삭제: " + d2.delete()); // false (비어있지 않음)
참고: delete()로 디렉터리를 삭제하려면 디렉터리가 비어 있어야 합니다.
4. 디렉터리 탐색
public String[] list(): 디렉터리 내 모든 파일/디렉터리 이름 문자열 배열 반환public File[] listFiles(): 디렉터리 내 모든 파일/디렉터리 File 객체 배열 반환
File dir = new File("d:\\java_code");
String[] names = dir.list();
for (String name : names) {
System.out.println(name);
}
File[] files = dir.listFiles();
for (File file : files) {
System.out.println(file.getAbsolutePath());
}
참고: listFiles()를 호출하려면 해당 File 객체가 실제 존재하는 디렉터리여야 합니다. 그렇지 않으면 null이 반환됩니다.
5. 재귀를 이용한 하위 디렉터리 출력
디렉터리 깊이를 알 수 없으므로 재귀 호출을 사용합니다.
public class RecursivePrint {
public static void main(String[] args) {
File dir = new File("D:\\aaa");
printAll(dir);
}
public static void printAll(File dir) {
File[] items = dir.listFiles();
if (items == null) return;
for (File item : items) {
if (item.isFile()) {
System.out.println("파일: " + item.getAbsolutePath());
} else {
System.out.println("디렉터리: " + item.getAbsolutePath());
printAll(item);
}
}
}
}
6. 종합 예제
6.1 특정 확장자 파일 검색
D:\aaa 디렉터리에서 .java 파일을 모두 찾아 출력합니다.
public class FileSearch {
public static void main(String[] args) {
File dir = new File("D:\\aaa");
searchJava(dir);
}
public static void searchJava(File dir) {
File[] items = dir.listFiles();
if (items == null) return;
for (File item : items) {
if (item.isFile()) {
if (item.getName().endsWith(".java")) {
System.out.println("찾은 파일: " + item.getAbsolutePath());
}
} else {
searchJava(item);
}
}
}
}
6.2 FileFilter로 최적화
java.io.FileFilter 인터페이스를 구현하여 조건에 맞는 파일만 필터링합니다.
public class FilterDemo {
public static void main(String[] args) {
File dir = new File("D:\\aaa");
filterAndPrint(dir);
}
public static void filterAndPrint(File dir) {
// 익명 클래스 사용
File[] items = dir.listFiles(new FileFilter() {
@Override
public boolean accept(File pathname) {
return pathname.getName().endsWith(".java") || pathname.isDirectory();
}
});
if (items == null) return;
for (File item : items) {
if (item.isFile()) {
System.out.println("필터된 파일: " + item.getAbsolutePath());
} else {
filterAndPrint(item);
}
}
}
}
6.3 Lambda 표현식으로 간소화
FileFilter는 함수형 인터페이스이므로 Lambda로 더 간결하게 작성할 수 있습니다.
public static void lambdaFilter(File dir) {
File[] items = dir.listFiles(f -> f.getName().endsWith(".java") || f.isDirectory());
if (items == null) return;
for (File item : items) {
if (item.isFile()) {
System.out.println("람다 필터: " + item.getAbsolutePath());
} else {
lambdaFilter(item);
}
}
}