윈도우 탐색기로 하는 행동을 자바로 구현!
//파일 경로
String path = "C:\\class\\code\\java\\file\\data.txt";
//파일 참조 객체 > java.io.File 클래스
File file = new File(path);
//꼭 파일 유무 확인하면서 파일 조작 해야함!!
if(file.exists()) {
//파일 조작 > 많은 기능이 다양하게 존재!
System.out.println(file.getName()); //data.txt (파일명)
System.out.println(file.isFile()); //true (파일 or 폴더)
System.out.println(file.isDirectory()); //false (파일 or 폴더)
System.out.println(file.length()); //16 > 파일크기(byte)
System.out.println(file.getAbsolutePath());//실제 파일 경로
System.out.println(file.lastModified()); // 1705547421511 > 누적값(epoch time) > 마지막 수정날짜
Calendar c1 =Calendar.getInstance();
System.out.println(c1.getTimeInMillis());
c1.setTimeInMillis(file.lastModified());
System.out.printf("%tF %tT\n" ,c1, c1);
System.out.println(file.isHidden()); //숨김 파일인지
System.out.println(file.canRead()); //읽기 가능
System.out.println(file.canWrite()); //수정 가능
System.out.println(file.getParent()); //관리하고 있는 폴더의 위치
}else {
System.out.println("해당 경로에 파일이 없습니다.");
}
//폴더 경로
String path = "C:\\class\\code\\java\\file";
//폴더 참조 객체
//폴더가 파일의 일종이라 파일과 같은 클래스를 사용
File dir = new File(path);
if(dir.exists()) {
System.out.println(dir.getName());
System.out.println(dir.isFile());
System.out.println(dir.isDirectory());
System.out.println(dir.length()); //0 => 안에 내용물의 크기.
System.out.println(dir.getAbsolutePath());
System.out.println(dir.isHidden());
System.out.println(dir.canRead());
System.out.println(dir.canWrite());
System.out.println(dir.getParent());
}else {
System.out.println("폴더가 존재하지 않습니다.");
}
createNewFile()
//생성
String path = "C:\\class\\code\\java\\file\\score.txt";
File file = new File(path);
try {
//동일한 파일이 있으면 동작 안함 (false)
boolean result = file.createNewFile();
System.out.println(result);
} catch (IOException e) {
e.printStackTrace();
}
renameTO
: 원래 있는 파일과 바꿀 파일 경로를 만든 다음
//파일명 수정
//- score.txt > jumsu.txt
String path = "C:\\class\\code\\java\\file\\score.txt";
File file = new File(path);
String path2 = "C:\\class\\code\\java\\file\\jumsu.txt";
File file2 = new File(path2);
//"C:\\class\\code\\java\\file\\score.txt" => "C:\\class\\code\\java\\file\\score.txt"
boolean result = file.renameTo(file2);
System.out.println(result);
//이동
String path = "C:\\class\\code\\java\\file\\score.txt";
File file = new File(path);
//파일 이름도 바꾸고 폴더도 이동함 !!
String path2 = "C:\\class\\code\\java\\move\\jumsu.txt";
File file2 = new File(path2);
boolean result = file.renameTo(file2);
System.out.println(result);
delete()
❗ 주의 할 점 ❗
: 폴더를 삭제할 때 폴더 안에 파일이 있으면 삭제 안됨 !
=> 파일을 지우고 폴더를 삭제 해야 함!
: delete()는 진짜 삭제라 신중하게!!
//삭제
String path = "C:\\class\\code\\java\\file\\score.txt";
File file = new File(path);
if(file.exists()) {
//보통 삭제 : 휴지통 폴더로 이동하기
//진짜 삭제 : 복구 불가능
boolean result = file.delete(); //휴지통에도 없어! 진짜 지워짐
System.out.println(result);
}
mkdirs()
: 최종 폴더까지 중간에 낀 폴더가 없으면
=> mkdir
: 여러 폴더를 거쳐서 가야한다면
=> mrdirs
String path = "C:\\class\\code\\java\\file\\bbb\\ccc\\ddd";
File dir = new File(path);
if(!dir.exists()) {
//폴더가 없음
//중간에 없는 폴더까지 포함해 최종 ddd 폴더까지 만들기
boolean result = dir.mkdirs();// make directorys
System.out.println(result);
else {
System.out.println("같은 이름의 폴더가 존재함.");
}
: 회원별 개인 폴더 만들기
//요구사항] 회원 > 회원명으로 개인 폴더 생성
String[] member = {"홍길동","아무개","강아지","고양이","독수리"};
for(int i=0; i<member.length;i++) {
//path의 경로를 원하는 형식으로 지정
String path = String.format("C:\\class\\code\\java\\file\\회원\\[개인폴더]%s님",member[i]);
File dir = new File(path);
System.out.println(dir.mkdirs());
❗ 주의 할 점 ❗
널 체크 필요
: 디렉터리 안에 파일이 없거나 디렉터리 자체가 존재하지 않을 수 있습니다. 따라서 listFiles() 메서드로 얻은 배열은 null일 수 있으므로, 반드시 널 체크를 해주어야 합니다.
디렉터리와 파일 구분
: listFiles() 메서드는 디렉터리 안의 모든 파일과 디렉터리를 포함한 배열을 반환합니다. 따라서 반복문 내에서 각 요소가 파일인지 디렉터리인지 확인하는 로직이 필요합니다.
String path = "C:\\class\\dev\\eclipse";
File dir = new File(path);
//경로안 모든 파일들을 반환
//주의 사항 확인하기
File[] list = dir.listFiles();
if(dir.exists()) {
//대상 홀더의 내용물 > 목록(배열)으로 가져오기
//String[] list = dir.list();
//
//for(String item : list) {
// System.out.println(item); //자식의 이름만 반환
// }
//객체로 돌려줌
File[] list = dir.listFiles();
for (File item : list) {
if (item.isDirectory()) {
System.out.printf("[%s]\n", item.getName());
}
}
for (File item : list) {
if (item.isFile()) {
System.out.println(item.getName());
}
}
}
//결과
[configuration]
[dropins]
[features]
[p2]
[plugins]
[readme]
.eclipseproduct
artifacts.xml
eclipse.exe
eclipse.ini
eclipsec.exe
연습용으로 좋음!! 확실하게 하고 넘어가기
//폴더 > 정보?
//-717MB (752,028,237 바이트)
//-파일 13,052, 폴더 2,488
//-재귀 구조
String path = "C:\\class\\code\\java\\file";
File dir = new File(path);
if(dir.exists()) {
count(dir);
System.out.printf("총 파일 개수 :%,d개\n",fileCount);
System.out.printf("총 폴더 개수 :%,d개\n",dirCount);
System.out.printf("총 폴더 크기 :%,dB\n",dirSize);
}
}
private static void count(File dir) {
//1. 목록 가져오기
File[] list = dir.listFiles();
//2. 파일 > 개수
for(File file : list) {
if(file.isFile()) {
//파일을 지우는 상황 = 모든 폴더를 찾아 파일을 다 지움
file.delete();
// fileCount++;
// dirSize += file.length();
}
}
//3. 자식 폴더 > 동일한 행동 반복
for(File subdir : list) {
if(subdir.isDirectory()) {
dirCount++;
//1~3번 반복
count(subdir);
}
}
//빈폴더 => 지울 수 있음
dir.delete();