本文目录导读:

- 使用 File.length() 方法(最常用)
- 使用 Files.size() 方法(Java 7+)
- 使用 FileChannel.size() 方法
- 获取目录大小(递归计算)
- 完整的工具类示例
- 注意事项
- 推荐使用
在Java中获取文件大小有多种方法,以下是常用的几种方式:
使用 File.length() 方法(最常用)
import java.io.File;
public class GetFileSizeExample {
public static void main(String[] args) {
File file = new File("test.txt");
if (file.exists()) {
long bytes = file.length();
System.out.println("文件大小(字节):" + bytes);
System.out.println("文件大小(KB):" + bytes / 1024.0);
System.out.println("文件大小(MB):" + bytes / (1024.0 * 1024));
} else {
System.out.println("文件不存在");
}
}
}
使用 Files.size() 方法(Java 7+)
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
public class GetFileSizeNio {
public static void main(String[] args) throws IOException {
Path path = Paths.get("test.txt");
if (Files.exists(path)) {
long bytes = Files.size(path);
System.out.println("文件大小(字节):" + bytes);
// 格式化显示
String formattedSize = formatSize(bytes);
System.out.println("格式化的文件大小:" + formattedSize);
}
}
// 格式化文件大小显示
public static String formatSize(long bytes) {
if (bytes < 1024) {
return bytes + " B";
} else if (bytes < 1024 * 1024) {
return String.format("%.2f KB", bytes / 1024.0);
} else if (bytes < 1024 * 1024 * 1024) {
return String.format("%.2f MB", bytes / (1024.0 * 1024));
} else {
return String.format("%.2f GB", bytes / (1024.0 * 1024 * 1024));
}
}
}
使用 FileChannel.size() 方法
import java.io.File;
import java.io.FileInputStream;
import java.nio.channels.FileChannel;
public class GetFileSizeChannel {
public static void main(String[] args) {
File file = new File("test.txt");
try (FileInputStream fis = new FileInputStream(file);
FileChannel channel = fis.getChannel()) {
long bytes = channel.size();
System.out.println("文件大小(字节):" + bytes);
} catch (IOException e) {
e.printStackTrace();
}
}
}
获取目录大小(递归计算)
import java.io.File;
public class GetDirectorySize {
public static void main(String[] args) {
File directory = new File("myFolder");
if (directory.exists() && directory.isDirectory()) {
long totalSize = getDirectorySize(directory);
System.out.println("目录总大小:" + totalSize + " 字节");
}
}
public static long getDirectorySize(File dir) {
long size = 0;
if (dir.isDirectory()) {
File[] files = dir.listFiles();
if (files != null) {
for (File file : files) {
if (file.isFile()) {
size += file.length();
} else if (file.isDirectory()) {
size += getDirectorySize(file);
}
}
}
}
return size;
}
}
完整的工具类示例
import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.text.DecimalFormat;
public class FileSizeUtils {
// 获取文件大小(字节)
public static long getFileSize(String filePath) {
File file = new File(filePath);
if (file.exists() && file.isFile()) {
return file.length();
}
return 0;
}
// 格式化为可读的大小
public static String formatFileSize(long size) {
if (size <= 0) return "0 B";
final String[] units = new String[]{"B", "KB", "MB", "GB", "TB"};
int digitGroups = (int) (Math.log10(size) / Math.log10(1024));
DecimalFormat df = new DecimalFormat("#,##0.#");
return df.format(size / Math.pow(1024, digitGroups)) + " " + units[digitGroups];
}
// 获取多个文件的总大小
public static long getTotalSize(String... filePaths) {
long total = 0;
for (String path : filePaths) {
total += getFileSize(path);
}
return total;
}
public static void main(String[] args) {
String filePath = "test.txt";
long bytes = getFileSize(filePath);
System.out.println("文件大小:" + bytes + " 字节");
System.out.println("格式化大小:" + formatFileSize(bytes));
// 获取多个文件总大小
long total = getTotalSize("file1.txt", "file2.txt", "file3.txt");
System.out.println("总大小:" + formatFileSize(total));
}
}
注意事项
- 返回值单位:所有方法返回的都是字节(bytes)大小
- 文件不存在:
File.length()返回 0,Files.size()抛出异常 - 性能:
File.length()最快,Files.size()次之 - 大文件:
File.length()返回long类型,最大支持 9EB - 文件锁定:
FileChannel.size()可以获取被其他进程锁定的文件大小
推荐使用
- 简单场景:使用
File.length() - Java 7+:使用
Files.size() - 需要格式化显示:结合
formatFileSize()方法 - 获取目录大小:使用递归方法