학원 23일차 - Java

48307 단어 학원자바자바

2021.04.28

폴더 조작

폴더 생성

  • dir.mkdir(); -> 폴더 생성
  • dir.mkdirs(); -> 중간에 없는 경로의 폴더도 생성하기.
public class Ex69_File {

	public static void main(String[] args) {

        // 폴더 생성
		//String path = "C:\\class\\java\\file\\CCC"; //희망하는 폴더의 경로
		
		String path = "C:\\class\\java\\file\\DDD\\EEE\\FFF"; //중간에 없는 경로의 폴더도 생성하기.
		File dir = new File(path);
				
		if(!dir.exists()) {
			//폴더 없으면 생성
			//dir.mkdir(); //make directory -> path와 동일한 경로에 폴더를 생성한다.
			
		 	//System.out.println(dir.mkdir());
			System.out.println(dir.mkdirs()); //행동의 결과는 true/false로 반환
			
			System.out.println("생성 완료");
			
		} else {
			//이미 있음
			System.out.println("같은 이름의 폴더가 이미 존재합니다.");
            
		}
    }//main
}
요구사항] 회원 > 회원별 개인 폴더 작성하기
public class Ex69_File {

	public static void main(String[] args) {
        
        //요구사항] 회원 > 회원별 개인 폴더 작성하기
		// - C:\\class\\java\\file\\member\\[개인폴더]홍길동
		String[] member = { "홍길동", "아무개", "하하하", "호호호" };
		
		for(String name : member) {
			path = String.format("C:\\class\\java\\file\\member\\[개인폴더]%s", name);
			dir = new File(path);
			System.out.println(dir.mkdirs());
			
			System.out.println(name + ". 개인 폴더 생성완료");
					
		}
    }
}
요구사항] 2021년 날짜별 폴더 생성
public class Ex69_File {

	public static void main(String[] args) {
        
        //요구사항] 2021년 날짜별 폴더 생성
		// - C:\\class\\java\\file\\date\\2021-01-01
		// - ....
		// - C:\\class\\java\\file\\date\\2021-12-31
		// - Calendar 사용
		Calendar c = Calendar.getInstance();
		c.set(2021, 0, 1); //2021-01-01
		
		//System.out.println(c.getActualMaximum(Calendar.DAY_OF_YEAR)); //년도에 총 몇일이 있는지 반환해줌.
		//System.out.println(c.getActualMaximum(Calendar.DATE)); //웡이 총 몇일이 있는지 반환해줌.
		//System.out.println(c.getActualMaximum(Calendar.DAY_OF_MONTH)); 
		
		for(int i=0; i<c.getActualMaximum(Calendar.DAY_OF_YEAR); i++) {
			
			path = String.format("C:\\class\\java\\file\\date\\%tF", c);
			dir = new File(path);

			if(dir.mkdirs()) {
				System.out.printf("%tF\n", c);
			} else {
				System.out.println("실패");
			}
		
			c.add(Calendar.DATE, 1); //하루 더해주기
		}
        
    }
}

폴더명 바꾸기

  • .renameTo(dir2);
public class Ex69_File {

	public static void main(String[] args) {
        
        //폴더명 바꾸기 + 폴더 이동하기 == 파일명 바꾸기 + 파일 이동하기 
		String path = "C:\\class\\java\\file\\GGG"; //원본
		File dir = new File(path);
		
		String path2 = "C:\\class\\java\\file\\AAA\\GGG"; //이름 바꾼 뒤의 결과
		File dir2 = new File(path2);
		
		if(dir.exists()) {
			dir.renameTo(dir2);
			System.out.println("완료");
		}
        
    }
}

폴더 삭제하기

  • dir.delete()
public class Ex69_File {

	public static void main(String[] args) {
        
        //폴더 삭제하기
		// - 빈폴더만 삭제 가능
		// - 내용물이 있으면 개발자가 그 안의 모든 내용물을 각각 직접 삭제한 뒤 해당 폴더를 빈폴더로 만들고 난 뒤 삭제한다.
		//String path = "C:\\class\\java\\file\\CCC"; //CCC -> 빈폴더 
		String path = "C:\\class\\java\\file\\member"; // member -> 내용물이 들어있음 -> false
		File dir = new File(path);
		
		if(dir.exists()) {
			System.out.println(dir.delete());
		}
        
    }
}

파일 복사

public class Ex69_File {

	public static void main(String[] args) {
        
        //파일 복사
		// - C:\class\java\file\JavaTest.zip
		// - C:\class\java\file\AAA\JavaTest.zip
		
		
		File org = new File("C:\\class\\java\\file\\JavaTest.zip"); //원본
		File copy = new File("C:\\class\\java\\file\\AAA\\JavaTest.zip"); //복사본
		
		//원본이 가지는 비트배열(0,1)을 희망하는 경로에 복사하는 작업
		
		//파일 복사 -> 바이트 단위 복사 
		//1. FileInputStream : 파일의 내용을 바이트 단위 읽기
		//2. FileOutpurStream : 파일의 내용을 바이트 단위 쓰기
		
		try {
			FileInputStream fis = new FileInputStream(org); //원본파일
			FileOutputStream fos = new FileOutputStream(copy); //복사 파일
			
			//버퍼(512KB ~ 1KB내외) : 원본파일의 내용을 단위로 쪼개서 옮기는 단위(임시저장소)
			//버퍼크기는 상황에 따라 다름.
			byte[] buffer = new byte[1024]; //1KB
			
			int length = 0;
			
			//복사
			while((length = fis.read(buffer)) > 0) { //원본에서 1KB만큼 101010..을 읽는다. length는 1024 리턴 -> 더이상 읽어올게 없으면 0을 반환.
				//System.out.println(length);
				
				fos.write(buffer, 0, length); //첫번째 바이트부터 마지막(1024전)까지 읽는다. -> 복사본이 될 위치에 원본에서 읽은 덩어리를 옮겨 적는다.
			}
			System.out.println("파일 복사완료");
			
		} catch (Exception e) {
			System.out.println(e); //예외던지기
		}
    }
}
  • 복사 클래스 따로 만들어서 import해서 사용하기

    1. 프로젝트 새로 생성(MyUtil) - 패키지 파일 생성(com.test.util) - 클래스파일 생성(MyFile) - 파일복사코드 클래스에 붙여넣기
  1. 프로젝트에서 마우스 오른쪽버튼 - Export - JAR file 선택 - 내보낼 Browser 선택 - 경로 선택& 파일명.jar (파일명은 소문자)

  1. jar파일 복사해서 폴더에 붙여넣기

  1. project에서 마우스 오른쪽버튼 - Build Path - configure Build path

  1. Add JARs - 파일 선택 (myutil.jar)

  1. import해서 사용하기
public class Ex69_File {

	public static void main(String[] args) {
        //myutil.jat - 라이브러리
		//import해오기
		
		MyFile file = new MyFile();
		
		String orgPath = "C:\\class\\java\\file\\JavaTest.zip";
		String copyPath = "C:\\class\\java\\file\\BBB\\JavaTest.zip";

		if(file.copy(orgPath, copyPath)) {
			System.out.println("복사 성공");
		} else {
			System.out.println("복사 실패");
		}
    }
}

폴더의 내용보기

  • .listFiles()
public class Ex69_File {

	public static void main(String[] args) {
        
        //폴더의 내용보기
		// - 자식 폴더  + 자식 파일 목록
		String path = "C:\\eclipse-jee-2021-03-R-win32-x86_64\\eclipse";
		File dir = new File(path);
		
		if(dir.exists()) {
//			String[] list = dir.list(); //dir.list() : 리턴값이 문자열배열.
			
//			for(String name : list) {
				//이름만으로는 폴더인지 파일인지 구분 할 수 없음(폴더와 파일 구별없이 정렬해서 출력)
				//System.out.println(name);
				
				//이름 -> 파일 객체 -> 정보 얻어오기
//				File file = new File(path + "\\" + name);
			
				//System.out.println(file.getName());
				//System.out.println(file.isFile());
				//System.out.println(file.isDirectory());
				
//				System.out.printf("%s - %s\n", file.getAbsoluteFile().getName(), file.isFile() ? "파일" : "폴더");
			
			//dir.listFiles() : 파일 배열 리턴
			File[] list = dir.listFiles(); //사용빈도 높음.
			
			//for(File file : list) {
			//	System.out.printf("%s - %s\n", file.getAbsoluteFile().getName(), file.isFile() ? "파일" : "폴더");
			//}
			
			
			//출력 -> 탐색기처럼 출력(폴더 먼저 출력 -> 파일 출력)
			for(File sub : list) {
				if(sub.isDirectory()) { //너 폴더니? 먼저 출력
					System.out.printf("[%s]\n", sub.getName());
				}
			}
			
			for(File sub : list) {
				if(sub.isFile()) { //너 파일이니? 파일만 출력
					System.out.println(sub.getName());
				}
			}
			
			}
//		}
        
    }
}

특정 폴더 안의 파일 개수 세기 - 재귀 메소드

재귀메소드가 필요한 이유 - 폴더가 몇단계까지 있는지 알 수 없음.
public class Ex69_File {

	public static void main(String[] args) {
        
        // 재귀메소드
		// - 팩토리얼
		// - 디렉토리 구조(****)
		
		
		//특정 폴더에 들어있는 파일의 개수?
		// - 크기 : 746MB (782,832,068 바이트)
		// - 내용 : 파일 11,973, 폴더 2,608
		
		String path = "C:\\eclipse-jee-2021-03-R-win32-x86_64\\eclipse";
		File dir = new File(path); //1. 객체 생성, 대상 폴더 찾아가기
		
		int count = 0; //누적 변수
		
		if(dir.exists()) {
			//2. 폴더 안의 목록
			File[] list = dir.listFiles();
			
			for(File sub : list) {
				//3. 하나씩 파일인지 확인 -> 개수 세기
				if(sub.isFile()) {
					count++;
				}
			}
			
			//4. 폴더 안의 폴더 찾아가기
			for(File sub : list) {
				if(sub.isDirectory()) {
					//5. 폴더 안의 목록
					File[] sublist = sub.listFiles();
					
					//6.파일인지 확인 -> 개수 세기 
					for(File subsub : sublist) {
						if(subsub.isFile()) {
							count++;
						}
					}
					
					//7. 폴더 안의 폴더 안의 폴더 찾아가기
					for(File subsub : sublist) {
						//8. 폴더인지 확인
						if(subsub.isDirectory()) {
							//9. 폴더 목록 확인
							File[] subsublist = subsub.listFiles();
							
							//10. 파일인지 폴더니 -> 파일 개수 확인
							for(File subsubsub : subsublist) {
								if(subsubsub.isFile()) {
									count++;
								}
							}
						}
					}
				}
			}
			
			System.out.printf("총 파일 개수: %,d개\n", count); //총 파일 개수: 1,904개 -> 폴더가 몇단계까지 있는지 알 수 없음. 
			
		}

        
    }
}
재귀메소드 사용
public class Ex69_File {

	public static void main(String[] args) {
        
        String path = "C:\\eclipse-jee-2021-03-R-win32-x86_64\\eclipse";
		File dir = new File(path);
		
		if(dir.exists()) {
			
			countFile(dir);
			
			System.out.printf("총 파일 개수: %,d개\n", count);
			System.out.printf("총 폴더 개수: %,d개\n", dcount);
			System.out.printf("폴더 크기: %,dB\n", size);
			System.out.printf("폴더 크기: %,.0fMB\n", (double)size/1024/1024);
		}
		
	}

	//
	private static void countFile(File dir) {
		
		//파일 목록 확인
		File[] list = dir.listFiles();
		
		//목록에서 파일인 것만 개수 세기.
		for(File sub : list) {
			if(sub.isFile()) {
				count++;
				size += sub.length(); //폴더크기 = 모든 파일 크기의 합
			}
		}
		
		//폴더 찾아가기
		for(File sub : list) {
			if (sub.isDirectory()) {
				//****
				//폴더안의 폴더들을 다 돌면 탈출함.(모든 폴더 접근)
				countFile(sub); //재귀호출
				
			}
		}
		
		dcount++; //countFile() : 이 메소드 호출이 곧 폴더 1개가 존재한다. 
        
    }
}

좋은 웹페이지 즐겨찾기