자바

JAVA STEP 41. File/Directory 조작 예제

2023. 2. 24. 23:50
728x90

★ 예제 1) 요구사항 : 파일의 경로를 입력받아 파일 정보를 출력하시오.

  • 조건
    • 파일 크기 단위 변환 출력(소수이하 1자리까지) : B, KB, MB, GB, TB
  • 파일경로
    • /Users/kimdaehwan/Desktop/Quest/file/class.txt
  •  소스코드
  •  
public class Q0110 {

	public static void main(String[] args) {
		
		//파일 경로: /Users/kimdaehwan/Desktop/Quest/file/class.txt
		
		String path = "/Users/kimdaehwan/Desktop/Quest/file/class.txt";
		File file = new File(path);
		
		System.out.printf("파일명 : %s\n", file.getName() );
		System.out.printf("파일 종류 : %s\n", file.getName().substring(file.getName().lastIndexOf(".")+1));
		System.out.printf("파일 크기 : %s", transe(path));

	}//main
	
	public static String transe(String path) {
		
		File file = new File(path);
		long size = 0;
		String result = "";
		
		if(file.exists()) {
			
			size = file.length();
			
		}
		
		if(size<1024) {
			return result += size + "B";
		} else if (size < 1024*1024) {
			return result += String.format("%.1f", size / 1024.0) + "KB";
		} else if (size < 1024*1024*1024) {
			return result += String.format("%.1f", size / 1024.0 / 1024.0) + "MB";
		} else if (size < 1024*1024*1024*1024) {
			return result += String.format("%.1f", size / 1024.0 / 1024.0 / 1024.0) + "GB";
		} else if (size < 1024*1024*1024*1024*1024) {
			return result += String.format("%.1f", size / 1024.0 / 1024.0 / 1024.0 / 1024.0) + "TB";
		} 
		
		return "";
	}

}

 

★ 예제 2) 요구사항 : 지정한 폴더의 특정 파일(확장자)만을 출력하시오.

  • 조건
    • 확장자 대소문자 구분없이 검색 가능
  • 소스코드
  •  
public class Q0111 {

	public static void main(String[] args) {

		Scanner scan = new Scanner(System.in);
		

		System.out.print("폴더 선택 : ");
		String path = scan.nextLine();
		
		System.out.print("확장자 : ");
		String temp = scan.nextLine();
		
		File dir = new File(path);
		
		File[] list = dir.listFiles();
		
		String result2 = "";
		
		for(File file : list) {
			String result = file.getName().substring(file.getName().lastIndexOf(".")+1);
			
			if(temp.equals(result)) {
				result2 += String.format("%s\n", file.getName());
			}
		}
		System.out.println(result2);
		
	}

}
  • 실행결과
  •  

예제 2 실행결과

 

★ 예제 3) 요구사항 : 지정한 파일을 다른 폴더로 이동하고, 이동한 파일과 동일한 파일명의 파일이 존재하는 경우 중복 처리하시오.

  • 조건
  • 해당 폴더에 이미 동일 파일이 있을 경우 덮어쓰거나(Y) or 작업을 취소(N) 하시오
  • 소스코드
  •  
public class Q0112 {

	public static void main(String[] args) {
		
		Scanner scan = new Scanner(System.in);
		
		System.out.print("이동할 파일 주소 : ");
		String storePath = scan.nextLine();
		
		System.out.print("이동시킬 파일 주소 : ");
		String movePath = scan.nextLine();
		
		System.out.println("파일 이동을 실행합니다.");
		
		File storedir = new File(storePath);
		File[] storelist = storedir.listFiles();
		
		File movedir = new File(movePath);
		File[] movelist = movedir.listFiles();
		
		if(!movedir.exists()) {
			storedir.renameTo(movedir);
			System.out.println("파일 이동을 완료했습니다.");
		}else {
			System.out.print("같은 이름을 가지는 파일이 존재합니다. 덮어쓸까요? (Y : N)");
			String result = scan.next();
			
			if(result.equals("Y")) {
				movedir.delete();
				storedir.renameTo(movedir);
				System.out.println("파일 이동을 완료했습니다.");
			}else {
				System.out.println("작업을 취소합니다.");
			}
		}

	}

}
  • 실행결과
  •  

예제 3 실행결과

 

★ 예제 4) 요구사항 : 음악 파일이 100개 있다. 파일명 앞에 일련 번호를 붙이시오

  • 조건
    • 001부터 3자리 형식으로 붙이시오.
  • 소스코드
  •  
public class Q0113 {

	public static void main(String[] args) {
		
		String path = "/Users/kimdaehwan/Desktop/Quest/kind/음악 파일/Music";
		
		File dir = new File(path);
		int n = 1;
		
		File[] list = dir.listFiles();
		
		for(File file : list) {
			
			if(file.getName().substring(file.getName().lastIndexOf(".")+1).toLowerCase().equals("mp3")) {
				
				File temp = new File(path + "/" + String.format("[%03d]%s", n, file.getName()));
				file.renameTo(temp);
				n++;
			}
		}
		System.out.println("완료되었습니다.");
	}

}

 

  • 실행결과

예제 4 실행결과

 

★ 예제 5) 요구사항 : 이미지 파일이 있다. 확장자별로 파일이 몇개 있는지 세시오

  • 조건
    • 새로운 확장자 파일이 추가되도 동작이 가능하게 구현하시오.
  • 소스코드
  •  
public class Q0114 {

	public static void main(String[] args) {
		
		String path = "/Users/kimdaehwan/Desktop/Quest/kind/확장자별 카운트";
		
		File dir = new File(path);
		
		HashMap<String,Integer> number = new HashMap<String,Integer>();
		
		File[] list = dir.listFiles();
		
		for(File file : list) {
			//확장자가 무엇인지 나누는 작업
			String result = file.getName().substring(file.getName().lastIndexOf(".")+1);
			
			//확장자를 나눈 후, 해당 확장자에 대해 key값을 설정하여 개수에 따라 증가
			if(number.get(result) == null) {
				number.put(result,1);
			}else {
				number.put(result, number.get(result)+1);
			}
		}
		
		System.out.println(number);
		//number.keySet = number의 HashMap에서 key값만을 가져와서 keys라는 배열에 저장.
		Set<String> keys = number.keySet();
		
		for(String key : keys) {
			System.out.printf("*.%s : %d개\n", key, number.get(key));
		}

	}

}

 

  • 실행결과
  •  

예제 5 실행결과

 

★ 예제 6) 요구사항 : 파일의 크기가 0byte인 파일만 삭제하시오.

  • 조건
  • 폴더 > 파일 제거
  • 소스코드
  •  
public class Q0115 {

	public static void main(String[] args) {
		
		String path = "/Users/kimdaehwan/Desktop/Quest/kind/파일 제거";
		
		File dir = new File(path);
		
		File[] list = dir.listFiles();
		
		int n = 0;
		
		for(File file : list) {
			if(file.length()==0) {
				file.delete();
				n++;
			}
		}
		System.out.printf("총 %d개의 파일을 삭제했습니다.", n);
	}

}

 

  • 실행결과

예제 6 실행결과

 

★ 예제 7) 요구사항 : MusicA 폴더와 MusicB 폴더를 서로 비교해서 양쪽 폴더에 모두 존재하는 파일만 출력하시오.

  • 조건
    • 중복 파일을 찾아내시오.
  • 소스코드
  •  
public class Q0116 {

	public static void main(String[] args) {
		
		String path1 = "/Users/kimdaehwan/Desktop/Quest/kind/동일 파일/MusicA";
		String path2 = "/Users/kimdaehwan/Desktop/Quest/kind/동일 파일/MusicB";
		
		File dir1 = new File(path1);
		File dir2 = new File(path2);
		
		File[] list1 = dir1.listFiles();
		File[] list2 = dir2.listFiles();
		
		for(File file : list1) {
			for(File file2 : list2) {
				if(file.getName().equals(file2.getName())) {
					System.out.println(file.getName());
				}
			}
		}

	}

}

 

  • 실행결과

예제 7 실행결과

 

★ 예제 8) 요구사항 : 내용물이 있는 "delete"폴더를 삭제하시오.

  • 조건
    • 재귀 메소드 사용
    • 삭제된 파일과 자식 폴더 개수를 출력하시오.
  • 소스코드
  •  
public class Q0117 {

	public static void main(String[] args) {
		
		String path = "/Users/kimdaehwan/Desktop/Quest/kind/폴더 삭제/delete";
		
		File dir = new File(path);
		
		HashMap<String, Integer> count = new HashMap<String, Integer>(); 
		count.put("dir", 0);
		count.put("file", 0);
		
		deleteFile(dir, count);
		
		System.out.println("폴더를 삭제했습니다.");
		System.out.printf("삭제된 폴더는 %d개이고, 파일은 %d개 입니다.", count.get("dir"), count.get("file"));
	}//main
	
	private static void deleteFile(File dir, HashMap<String, Integer> count) {
		
		File[] list = dir.listFiles();
		
		//만약 파일이 담긴 곳이라면 이 문장을 실행
		for(File file : list) {
			if(file.isFile()) {
				count.put("file", count.get("file")+1);
				file.delete();
			}
		}
		//만약 디렉터리가 담긴 곳이라면 이 문장을 실행
		for(File file2 : list) {
			if(file2.isDirectory()) {
				deleteFile(file2, count); //재귀, 자기 자신을 반복
			}
		}
		
		count.put("dir", count.get("dir")+1);
		
		dir.delete();
		
	}

}

 

  • 실행결과

예제 8 실행결과

 

★ 예제 9) 요구사항 : 폴더 내의 모든 파일들을 찾아 크기를 비교하고, 크기가 큰 순으로 정렬하시오.

  • 조건
    • 자식 폴더내의 파일도 모두 검색하시오.
    • 부모 자식 폴더에 상관없이 파일을 한번에 비교하시오.
  • 소스코드
  •  
public class Q0118 {

	public static void main(String[] args) {
		
		String path = "/Users/kimdaehwan/Desktop/Quest/kind/크기정렬";
		
		File dir = new File(path);
		
		ArrayList<File> files = new ArrayList<File>();
		
		addFile(dir, files);
		
		for(int i=0; i<files.size()-1; i++) {
			for(int j=0; j<files.size()-i-1; j++) {
				if(files.get(j).length() < files.get(j+1).length()) {
					File temp = files.get(j);
					files.set(j, files.get(j+1));
					files.set(j+1, temp);
				}
			}
		}
		
		System.out.printf("%-33s%s\t%10s\n", "[파일명]", "[크기]", "[파일이 들어있는 폴더]");
		
		for(File file : files) {
			System.out.printf("%-30s\t%10s\t%s\n"
								,file.getName()
								,getSize(file.length())
								,file.getParentFile().getName());
		}

	}
	
	private static String getSize(long size) {
		String result = "";
		
		if(size<1024) {
			return result += size + "B";
		} else if (size < 1024*1024) {
			return result += String.format("%.1f", size / 1024.0) + "KB";
		} else if (size < 1024*1024*1024) {
			return result += String.format("%.1f", size / 1024.0 / 1024.0) + "MB";
		} else if (size < 1024*1024*1024*1024) {
			return result += String.format("%.1f", size / 1024.0 / 1024.0 / 1024.0) + "GB";
		} else if (size < 1024*1024*1024*1024*1024) {
			return result += String.format("%.1f", size / 1024.0 / 1024.0 / 1024.0 / 1024.0) + "TB";
		} return "";
	}

	private static void addFile(File dir, ArrayList<File> files) {
		
		File[] list = dir.listFiles();
		
		//만약 파일이 담긴 곳이라면 이 문장을 실행
		for(File file : list) {
			if(file.isFile()) {
				files.add(file);
			}
		}
		
		//만약 디렉터리가 담긴 곳이라면 이 문장을 실행
		for(File file2 : list) {
			if(file2.isDirectory()) {
			addFile(file2,files);//재귀 함수
			}
		}
		
	}
}

 

★ 예제 10) 요구사항 : 아래의 조건에 따라 파일을 폴더별로 분류/이동하시오.

  • 조건
    • 1차 : 직원 이름으로 폴더 생성
    • 2차 : 년도별로 폴더 생성
    • 3차 : 각 파일을 직원 > 년도 폴더에 이동
  • 소스코드
  •  
public class Q0118 {

	public static void main(String[] args) {
		
		String path = "/Users/kimdaehwan/Desktop/Quest/kind/크기정렬";
		
		File dir = new File(path);
		
		ArrayList<File> files = new ArrayList<File>();
		
		addFile(dir, files);
		
		for(int i=0; i<files.size()-1; i++) {
			for(int j=0; j<files.size()-i-1; j++) {
				if(files.get(j).length() < files.get(j+1).length()) {
					File temp = files.get(j);
					files.set(j, files.get(j+1));
					files.set(j+1, temp);
				}
			}
		}
		
		System.out.printf("%-33s%s\t%10s\n", "[파일명]", "[크기]", "[파일이 들어있는 폴더]");
		
		for(File file : files) {
			System.out.printf("%-30s\t%10s\t%s\n"
								,file.getName()
								,getSize(file.length())
								,file.getParentFile().getName());
		}

	}
	
	private static String getSize(long size) {
		String result = "";
		
		if(size<1024) {
			return result += size + "B";
		} else if (size < 1024*1024) {
			return result += String.format("%.1f", size / 1024.0) + "KB";
		} else if (size < 1024*1024*1024) {
			return result += String.format("%.1f", size / 1024.0 / 1024.0) + "MB";
		} else if (size < 1024*1024*1024*1024) {
			return result += String.format("%.1f", size / 1024.0 / 1024.0 / 1024.0) + "GB";
		} else if (size < 1024*1024*1024*1024*1024) {
			return result += String.format("%.1f", size / 1024.0 / 1024.0 / 1024.0 / 1024.0) + "TB";
		} return "";
	}

	private static void addFile(File dir, ArrayList<File> files) {
		
		File[] list = dir.listFiles();
		
		//만약 파일이 담긴 곳이라면 이 문장을 실행
		for(File file : list) {
			if(file.isFile()) {
				files.add(file);
			}
		}
		
		//만약 디렉터리가 담긴 곳이라면 이 문장을 실행
		for(File file2 : list) {
			if(file2.isDirectory()) {
			addFile(file2,files);//재귀 함수
			}
		}
		
	}
}

 

  • 실행결과

예제 10 실행결과
정렬된 파일들

 

728x90
저작자표시 비영리 변경금지 (새창열림)

'자바' 카테고리의 다른 글

JAVA STEP 43. File 입출력  (0) 2023.02.27
JAVA STEP 42. 재귀 메소드  (0) 2023.02.27
JAVA STEP 40. File/Directory 조작  (0) 2023.02.24
JAVA STEP 39. Hashset 직접 구현하기  (0) 2023.02.24
JAVA STEP 38. 컬렉션(HashSet)  (0) 2023.02.24
'자바' 카테고리의 다른 글
  • JAVA STEP 43. File 입출력
  • JAVA STEP 42. 재귀 메소드
  • JAVA STEP 40. File/Directory 조작
  • JAVA STEP 39. Hashset 직접 구현하기
IT의 큰손
IT의 큰손
IT계의 큰손이 되고 싶은 개린이의 Log 일지
Developer Story HouseIT계의 큰손이 되고 싶은 개린이의 Log 일지
IT의 큰손
Developer Story House
IT의 큰손
전체
오늘
어제
  • 분류 전체보기 (457)
    • 정보처리기사 필기 (18)
    • 정보처리기사 실기 (12)
    • 정보처리기사 통합 QUIZ (12)
    • 빅데이터 (11)
    • 안드로이드 (11)
    • 웹페이지 (108)
    • 자바 (49)
    • SQLD (3)
    • 백준 알고리즘 (76)
    • 데이터베이스 (41)
    • 깃허브 (2)
    • Library (14)
    • Server (31)
    • 크롤링&스크래핑 (3)
    • Spring (23)
    • Vue.js (13)
    • React (27)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

  • Developer Stroy House

인기 글

태그

  • css
  • 웹개발
  • JavaScript
  • 앱개발자
  • jsp
  • IT개발자
  • 알고리즘
  • React
  • 정보처리기사
  • IT자격증공부
  • 자바
  • ajax
  • 코딩테스트
  • html
  • jquery
  • 데이터베이스
  • 정보처리기사필기
  • DB
  • 백엔드
  • 백준
  • java
  • 웹개발자
  • it
  • 개발자
  • 웹페이지
  • DBA
  • 프론트엔드
  • 개발블로그
  • IT자격증
  • 정보보안전문가

최근 댓글

최근 글

Designed By hELLO
IT의 큰손
JAVA STEP 41. File/Directory 조작 예제
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.