Write a program to print the folder or directory size in bytes, KBs, MBs and GBs.
Approach 1: Traverse the folder recursively and accumulate all the files size.
FolderSize.java
package com.sample.app.files;
import java.io.File;
public class FolderSize {
	private static long getFolderSizeInBytes(final File folder) {
		long lengthInBytes = 0;
		final File[] files = folder.listFiles();
		int count = files.length;
		for (int i = 0; i < count; i++) {
			if (files[i].isFile()) {
				lengthInBytes += files[i].length();
			} else {
				lengthInBytes += getFolderSizeInBytes(files[i]);
			}
		}
		return lengthInBytes;
	}
	private static double bytesToKB(long sizeInBytes) {
		return sizeInBytes / (double) 1024;
	}
	private static double bytesToMB(long sizeInBytes) {
		return sizeInBytes / (double) (1024 * 1024);
	}
	private static double bytesToGB(long sizeInBytes) {
		return sizeInBytes / (double) (1024 * 1024 * 1024);
	}
	public static void main(String[] args) {
		File folder = new File("/Users/krishna/Documents ");
		long folderSizeInBytes = getFolderSizeInBytes(folder);
		System.out.println("Folder size in bytes : " + folderSizeInBytes);
		System.out.println("Folder size in KB : " + bytesToKB(folderSizeInBytes));
		System.out.println("Folder size in MB : " + bytesToMB(folderSizeInBytes));
		System.out.println("Folder size in GB : " + bytesToGB(folderSizeInBytes));
	}
}
Approach 2: Using Files.walkFileTree. Files.walkFileTree method walks a file tree.
FolderSize.java
package com.sample.app.files;
import java.io.File;
import java.io.IOException;
import java.nio.file.FileVisitResult;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.SimpleFileVisitor;
import java.nio.file.attribute.BasicFileAttributes;
import java.util.concurrent.atomic.AtomicLong;
public class FolderSize {
	private static long getFolderSizeInBytes(final File folder) {
		Path directory = folder.toPath();
		final AtomicLong lengthInBytes = new AtomicLong(0);
		try {
			Files.walkFileTree(directory, new SimpleFileVisitor<Path>() {
				@Override
				public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
					lengthInBytes.addAndGet(attrs.size());
					return FileVisitResult.CONTINUE;
				}
			});
		} catch (IOException e) {
			throw new RuntimeException(e.getMessage());
		}
		return lengthInBytes.longValue();
	}
	private static double bytesToKB(long sizeInBytes) {
		return sizeInBytes / (double) 1024;
	}
	private static double bytesToMB(long sizeInBytes) {
		return sizeInBytes / (double) (1024 * 1024);
	}
	private static double bytesToGB(long sizeInBytes) {
		return sizeInBytes / (double) (1024 * 1024 * 1024);
	}
	public static void main(String[] args) {
		File folder = new File("/Users/krishna/Documents");
		long folderSizeInBytes = getFolderSizeInBytes(folder);
		System.out.println("Folder size in bytes : " + folderSizeInBytes);
		System.out.println("Folder size in KB : " + bytesToKB(folderSizeInBytes));
		System.out.println("Folder size in MB : " + bytesToMB(folderSizeInBytes));
		System.out.println("Folder size in GB : " + bytesToGB(folderSizeInBytes));
	}
}
Approach 3: Using Files.walk method.
Files.walk method return a Stream that is lazily populated with Path by walking the file tree rooted at a given starting file. The file tree is traversed depth-first, the elements in the stream are Path objects that are obtained as if by Path#resolve(Path) resolving the relative path against start.
FolderSize.java
package com.sample.app.files;
import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
public class FolderSize {
	private static long getFolderSizeInBytes(final File folder) {
		Path directory = folder.toPath();
		long lengthInBytes = 0l;
		try {
			lengthInBytes = Files.walk(directory).filter(file -> file.toFile().isFile())
					.mapToLong(file -> file.toFile().length()).sum();
		} catch (IOException e) {
			throw new RuntimeException(e.getMessage());
		}
		return lengthInBytes;
	}
	private static double bytesToKB(long sizeInBytes) {
		return sizeInBytes / (double) 1024;
	}
	private static double bytesToMB(long sizeInBytes) {
		return sizeInBytes / (double) (1024 * 1024);
	}
	private static double bytesToGB(long sizeInBytes) {
		return sizeInBytes / (double) (1024 * 1024 * 1024);
	}
	public static void main(String[] args) {
		File folder = new File("/Users/krishna/Documents");
		long folderSizeInBytes = getFolderSizeInBytes(folder);
		System.out.println("Folder size in bytes : " + folderSizeInBytes);
		System.out.println("Folder size in KB : " + bytesToKB(folderSizeInBytes));
		System.out.println("Folder size in MB : " + bytesToMB(folderSizeInBytes));
		System.out.println("Folder size in GB : " + bytesToGB(folderSizeInBytes));
	}
}
You may like
Get the content of resource file as string
Copy the content of file to other location
How to download a binary file in Java?
How to process a huge file line by line in Java?
How to process a large file in chunks?

No comments:
Post a Comment