Java에서 디렉토리, 파일 사이즈(byte)를 구하는 다양한 방법을 소개합니다.
1. File.length()로 파일 크기 계산
File.length()
는 파일의 크기를 리턴합니다. 단위는 byte입니다.
다음과 같이 파일 크기를 구할 수 있고, 다른 단위로 변환할 수도 있습니다.
File file = new File("/home/js/test/myfile/file1.txt");
if (file.exists()) {
double bytes = file.length();
double kilobytes = (bytes / 1024);
double megabytes = (kilobytes / 1024);
double gigabytes = (megabytes / 1024);
System.out.println("bytes : " + bytes);
System.out.println("kilobytes : " + kilobytes);
System.out.println("megabytes : " + megabytes);
System.out.println("gigabytes : " + gigabytes);
} else {
System.out.println("File does not exists!");
}
Output:
bytes : 169439.0
kilobytes : 165.4677734375
megabytes : 0.1615896224975586
gigabytes : 1.5780236572027206E-4
terabytes : 1.541038727737032E-7
2. File.length()로 디렉토리 크기 계산
만약 Folder에 대해서 File.length()
로 크기를 가져오면, Folder에 대한 파일 크기인 4096 byte만 리턴됩니다.
예를 들어, 아래 코드에서 myfile
폴더의 크기를 계산하면 하위에 있는 파일 크기들은 계산되지 않고 디렉토리의 크기인 4096 byte만 리턴됩니다.
따라서, 이런 식으로 디렉토리의 전체 크기를 계산할 수는 없습니다.
System.out.println();
File folder = new File("/home/js/test/myfile");
double bytes = folder.length();
System.out.println("bytes : " + bytes);
// output:
// bytes : 4096.0
만약 하위 파일들의 사이즈도 모두 계산하려면, 다음과 같이 하위 파일을 모두 탐색하고 파일의 크기의 합을 계산하면 됩니다.
File folder = new File("/home/js/test/myfile");
long bytes = getFolderSize(folder);
System.out.println("bytes : " + bytes);
public static long getFolderSize(File folder) {
long length = 0;
File[] files = folder.listFiles();
int count = files.length;
for (int i = 0; i < count; i++) {
if (files[i].isFile()) {
length += files[i].length();
} else {
length += getFolderSize(files[i]);
}
}
return length;
}
Output:
bytes : 7119049
3. Files로 디렉토리 크기 계산
Java7의 Files를 이용하여 디렉토리를 탐색할 수 있습니다. 탐색하면서 폴더가 아니고 파일인 경우, 그 크기를 더하면 됩니다.
다음 코드는 myfile 폴더 및 하위 파일들의 크기를 계산하는 예제입니다.
Path folder = Paths.get("/home/js/test/myfile");
AtomicLong bytes = new AtomicLong(0);
try {
Files.walkFileTree(folder, new SimpleFileVisitor<Path>() {
@Override
public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) {
bytes.addAndGet(attrs.size());
return FileVisitResult.CONTINUE;
}
});
} catch (IOException e) {
e.printStackTrace();
}
System.out.println("bytes : " + bytes);
Output:
bytes : 7119049
4. Stream으로 디렉토리 크기 계산
Files 클래스는 Files.walk() 메소드를 제공합니다. 이 메소드는 인자로 전달되는 폴더에 대한 하위 파일을 Stream<Path>
타입으로 리턴합니다.
다음과 같이 Stream에서 디렉토리의 하위 파일들만 필터링하여 파일 크기의 합을 구할 수 있습니다.
Path folder = Paths.get("/home/js/test/myfile");
try {
long bytes = Files.walk(folder)
.filter(p -> p.toFile().isFile())
.mapToLong(p -> p.toFile().length())
.sum();
System.out.println("bytes : " + bytes);
} catch (IOException e) {
e.printStackTrace();
}
Output:
bytes : 7119049
5. Commons-io 라이브러리로 디렉토리 크기 계산
Commons-io 라이브러리를 이용하면 더 간단하게 디렉토리의 크기를 구할 수 있습니다.
Commons-io를 사용하려면, Gradle 프로젝트의 경우 build.gradle
의 dependencies에 다음과 같이 추가합니다.
dependencies {
compile group: 'commons-io', name: 'commons-io', version: '2.6'
...
}
Maven 등의 다른 빌드시스템을 사용하는 프로젝트는 mvnrepository.com을 참고하셔서 설정하시면 됩니다.
다음은 디렉토리의 파일 크기를 계산하는 코드입니다.
File folder = new File("/home/js/test/myfile");
long bytes = FileUtils.sizeOfDirectory(folder);
System.out.println("bytes : " + bytes);
FileUtils.sizeOfDirectory()
의 인자로 전달되는 디렉토리의 파일 크기를 byte로 리턴합니다.
Output:
bytes : 7119049
참고
Related Posts
- Java - Unsupported class file major version 61 에러
- Java - String.matches()로 문자열 패턴 확인 및 다양한 예제 소개
- Java - 문자열 공백제거 (trim, replace)
- Java - replace()와 replaceAll()의 차이점
- Java - ArrayList 초기화, 4가지 방법
- Java - 배열 정렬(Sorting) (오름차순, 내림차순)
- Java - 문자열(String)을 비교하는 방법 (==, equals, compare)
- Java - StringBuilder 사용 방법, 예제
- Java - 로그 출력, 파일 저장 방법 (Logger 라이브러리)
- Java IllegalArgumentException 의미, 발생 이유
- Java - NullPointerException 원인, 해결 방법
- Seleninum의 ConnectionFailedException: Unable to establish websocket connection 해결
- Java - compareTo(), 객체 크기 비교
- Java - BufferedWriter로 파일 쓰기
- Java - BufferedReader로 파일 읽기
- Java charAt() 함수 알아보기
- Java - BigInteger 범위, 비교, 연산, 형변환
- Java contains()로 문자(대소문자 X) 포함 확인
- Java - Set(HashSet)를 배열로 변환
- Java - 문자열 첫번째 문자, 마지막 문자 확인
- Java - 문자열 한글자씩 자르기
- Java - 문자열 단어 개수 가져오기
- Java - 1초마다 반복 실행
- Java - 배열을 Set(HashSet)로 변환
- Java - 여러 Set(HashSet) 합치기
- Java - 명령행 인자 입력 받기
- Java - 리스트 역순으로 순회, 3가지 방법
- Java - 특정 조건으로 리스트 필터링, 3가지 방법
- Java - HashMap 모든 요소들의 합계, 평균 계산
- Java - 특정 조건으로 HashMap 필터링
- Java - 싱글톤(Singleton) 패턴 구현
- Java - 숫자 왼쪽에 0으로 채우기
- Java - String 배열 초기화 방법
- Java - 정렬된 순서로 Map(HashMap) 순회
- Java - HashMap에서 key, value 가져오기