자바

JAVA STEP 41. File/Directory 조작 예제

IT의 큰손 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