본문 바로가기
인천일보아카데미/- 학습일지

[학습일지]JAVA교육일지 35일차

by w1z 2022. 6. 13.

파일(File)


파일(File)

[폴더 생성, make directory]

- mkdir() : boolean

- D:\java\file 경로에 AAA폴더 생성 하기 (1개의 폴더)

String path = "D:\\java\\file\\AAA"; 

File dir = new File(path);

if(!dir.exists()) {
    dir.mkdir();
    System.out.println("생성 완료");
} else {
    System.out.println("같은 이름의 폴더가 이미 존재합니다.");
}


//OUTPUT
생성 완료
--> D:\java\file\ 경로에 AAA폴더 생성 완료

 

- mkdirs() : boolean

- D:\java\file 경로에 AAA 안에, TEST 안에, BBB 폴더 생성 하기 (3개의 폴더)

String path = "D:\\java\\file\\AAA\\TEST\\BBB"; 

File dir = new File(path);

if(!dir.exists()) {
    dir.mkdirs();
    System.out.println("생성 완료");
} else {
    System.out.println("같은 이름의 폴더가 이미 존재합니다.");
}


//OUTPUT
생성 완료
--> D:\java\file 경로에 AAA\TEST\BBB 총 3개 폴더 생성 완료

 

[폴더명 변경 & 폴더 이동]

- renameTo() : boolean

- 폴더명 변경 + 폴더 이동 == 파일명 변경 + 파일명 이동 (둘이 똑같다)

String path = "D\\java\\file\\AAA"; 
String path2 = "D\\java\\file\\CCC";

File dir = new File(path);
File dir2 = new File(path2);

if (dir.exists()) {
    dir.renameTo(dir2);
    System.out.println("완료");
}
//OUTPUT
완료
--> D\java\file에 있는 AAA폴더가 CCC폴더로 이름변경됨.

//----------------------------------------------------
path = "D\\java\\file\\CCC";
path2 = "D\\java\\file\\DDD\\EEE";

dir = new File(path);
dir2 = new File(path2);

if (dir.exists()) {
    dir.renameTo(dir2);
    System.out.println("완료");
}

//OUTPUT
완료
--> D\java\file에 있는 CCC폴더가 DDD\EEE 폴더로 이동됨.

 

[폴더 삭제하기]

- delete() : boolean

- 파일(file)은 무조건 삭제가 가능하지만, 폴더는 빈 폴더만 가능하다. (차이점)

- 폴더에 내용물이 있으면 삭제 불가 (개발자가 그 안의 모든 내용물을 각각 직접 삭제해야함)

String path = "D:\\java\\file\\AAA";

File dir = new File(path);

if (dir.exists()) {
    System.out.println(dir.delete());
}


//OUTPUT
true
--> D:\java\file 경로에 AAA 폴더 삭제됨

 

[파일 복사]

- 바이트 단위 복사

- FileInputStream : 파일의 내용을 바이트 단위 읽기

- FileOutputStream : 파일의 내용을 바이트 단위 쓰기

- try-catch문의 코드 내용보다 동작 원리만 이해하자. (복사 코드는 동일하므로 복붙가능)

File org = new File("D:\\java\\file\\Test.zip");
File copy = new File("D:\\java\\file\\AAA\\Test.zip");

try {
    FileInputStream fis = new FileInputStream(org);
    FileOutputStream fos = new FileOutputStream(copy);
    
    //버퍼(512KB ~ 1KB 내외)
    byte[] buffer = new byte[1024];
    
    int length = 0;
    
    //복사
    while ((length = fis.read(buffer)) > 0) {
    	fos.write(buffer, 0, length);
    }
    System.out.println("파일 복사 완료");
} catch (Exception e) {
	System.out.println(e);
}


//OUTPUT
파일 복사 완료
--> D:\java\file 경로에 있는 Test.zip 파일이 AAA폴더에 복사됨

 

[폴더의 내용보기]

- listFiles()

- 여러방법으로 해당 경로의 폴더/파일을 확인 할 수 있음.

String path = "C:\\eclipse";
File dir = new File(path);


if (dir.exists()) {
    System.out.println("========방법1========");
    File[] list = dir.listFiles();
    
    for (File file : list) {
        System.out.printf("%s - %s\n"
        				,file.getName()
                        ,file.isFile() ? "파일" : "폴더");
    }
    
    System.out.println("========방법2========");
    for(File sub : list) {
    	if(sub.isDirectory()) {
        	System.out.println("[%s]\n", sub.getName());
        }
    }
    for(File sub : list) {
    	if(sub.isFile()) {
        	System.out.println(sub.getName());
        }
    }
}


//OUTPUT
========방법1========
.eclipseproduct - 파일
artifacts.xml - 파일
configuration - 폴더
dropins - 폴더
eclipse.exe - 파일
eclipse.ini - 파일
eclipsec.exe - 파일
features - 폴더
lombok.jar - 파일
p2 - 폴더
plugins - 폴더
readme - 폴더

========방법2========
[configuration]
[dropins]
[features]
[p2]
[plugins]
[readme]
.eclipseproduct
artifacts.xml
eclipse.exe
eclipse.ini
eclipsec.exe
lombok.jar

 

[폴더 안에 모든 파일/폴더 개수  & 파일/폴더 크기]

- 재귀 호출 해야함 (for문으로 하면 한도끝도 없음...)

//C:\eclipse에 들어있는 파일의 개수?
//크기: 747MB (784,330,273 바이트)
//내용: 파일 11,979, 폴더 2,598

private static int count = 0;
private static int dirCount = 0;
private static long size = 0;

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

}

//재귀 호출 메소드
public 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) //재귀 호출
        }
    }
    dirCount++;
}


//OUTPUT
총 파일 개수: 11,979개
총 폴더 개수: 2,599개
폴더 크기(Byte): 784,330,417B
폴더 크기(MB): 748MB

MEMO>

# 답이없다.. 복습하자.. 문제 계속 풀자..

 

# File 너무 어지럽고 거기에 쓰이는 재귀호출 미치겠고!!!!!!!!!!!!

 

# File 클래스를 잘 활용하면 사무업무나, 여기저기에 많이 도움이 되니깐 필히!! 이해하고 공부하자!!