학원 23일차 - Java
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해서 사용하기
- 프로젝트 새로 생성(MyUtil) - 패키지 파일 생성(com.test.util) - 클래스파일 생성(MyFile) - 파일복사코드 클래스에 붙여넣기
- 프로젝트에서 마우스 오른쪽버튼 - Export - JAR file 선택 - 내보낼 Browser 선택 - 경로 선택& 파일명.jar (파일명은 소문자)
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 + ". 개인 폴더 생성완료");
}
}
}
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); //하루 더해주기
}
}
}
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("완료");
}
}
}
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해서 사용하기
- 프로젝트 새로 생성(MyUtil) - 패키지 파일 생성(com.test.util) - 클래스파일 생성(MyFile) - 파일복사코드 클래스에 붙여넣기
- jar파일 복사해서 폴더에 붙여넣기
- project에서 마우스 오른쪽버튼 - Build Path - configure Build path
- Add JARs - 파일 선택 (myutil.jar)
- 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개가 존재한다.
}
}
Author And Source
이 문제에 관하여(학원 23일차 - Java), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@hi-dae-in/학원-23일차-Java저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)