在 Java 中获取文件大小有多种方法,适用于不同的场景(如旧版 Java 8、新版 Java 7+ 的 NIO.2 等),以下是几种常用方式的详细说明和代码示例。

核心方法
获取文件大小的核心思路是:获取一个代表文件的 File 对象,然后调用其 length() 方法,这个方法返回文件的大小,单位是字节。
使用 java.io.File (最传统、兼容性最好)
这是最经典、最简单的方法,适用于所有 Java 版本。
基本用法
java.io.File 类有一个 length() 方法,可以直接返回文件的大小(字节)。
import java.io.File;
import java.io.IOException;
public class GetFileSizeExample {
public static void main(String[] args) {
// 1. 创建一个 File 对象,指向你的文件
// 请将 "path/to/your/file.txt" 替换为你的实际文件路径
File file = new File("path/to/your/file.txt");
// 2. 检查文件是否存在,避免 NullPointerException
if (file.exists() && file.isFile()) {
// 3. 调用 length() 方法获取大小
long fileSizeInBytes = file.length();
System.out.println("文件大小 (字节): " + fileSizeInBytes);
// --- 可选:将字节转换为更易读的格式 (KB, MB, GB) ---
double fileSizeInKB = fileSizeInBytes / 1024.0;
double fileSizeInMB = fileSizeInKB / 1024.0;
double fileSizeInGB = fileSizeInMB / 1024.0;
System.out.printf("文件大小 (KB): %.2f KB\n", fileSizeInKB);
System.out.printf("文件大小 (MB): %.2f MB\n", fileSizeInMB);
System.out.printf("文件大小 (GB): %.2f GB\n", fileSizeInGB);
} else {
System.out.println("文件不存在或不是一个常规文件。");
}
}
}
使用 Java 7+ 的 try-with-resources (推荐)
虽然 File.length() 不涉及 IO 流资源,但在处理文件路径时,如果路径来自不可靠的输入,可能会抛出 SecurityException。try-with-resources 主要用于管理资源(如流),但养成良好的异常处理习惯总是好的。

使用 java.nio.file.Path 和 java.nio.file.Files (Java 7+ 推荐)
从 Java 7 开始,引入了新的 NIO.2 (New I/O) API,java.nio.file 包提供了更强大、更灵活的文件操作方式,这是目前推荐的方式。
使用 Files.size(Path path)
Files 类提供了一个静态方法 size(),可以直接接收一个 Path 对象来获取文件大小,这种方式更现代化,并且是许多其他 NIO.2 操作的基础。
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
public class GetFileSizeNIOExample {
public static void main(String[] args) {
// 1. 使用 Paths.get() 方法创建一个 Path 对象
// 请将 "path/to/your/file.txt" 替换为你的实际文件路径
Path path = Paths.get("path/to/your/file.txt");
try {
// 2. 检查文件是否存在
if (Files.exists(path) && Files.isRegularFile(path)) {
// 3. 调用 Files.size() 方法获取大小
long fileSizeInBytes = Files.size(path);
System.out.println("文件大小 (字节): " + fileSizeInBytes);
// --- 可选:转换为更易读的格式 ---
System.out.println("文件大小 (KB): " + formatFileSize(fileSizeInBytes, "KB"));
System.out.println("文件大小 (MB): " + formatFileSize(fileSizeInBytes, "MB"));
System.out.println("文件大小 (GB): " + formatFileSize(fileSizeInBytes, "GB"));
} else {
System.out.println("文件不存在或不是一个常规文件。");
}
} catch (IOException e) {
// 处理可能发生的 IO 异常,例如文件无法读取
System.err.println("读取文件大小时出错: " + e.getMessage());
e.printStackTrace();
}
}
/**
* 辅助方法:将字节大小转换为指定单位的字符串
* @param size 字节大小
* @param unit 目标单位 ("KB", "MB", "GB")
* @return 格式化后的字符串
*/
public static String formatFileSize(long size, String unit) {
if (size <= 0) return "0";
final String[] units = new String[]{"B", "KB", "MB", "GB", "TB"};
int digitGroups = (int) (Math.log10(size) / Math.log10(1024));
return new DecimalFormat("#,##0.##").format(size / Math.pow(1024, digitGroups)) + " " + units[digitGroups];
}
}
为什么推荐 NIO.2?
- 更丰富的功能:除了获取大小,
Files类还提供了读写、复制、移动、检查属性等大量实用方法。 - 更好的性能:底层实现更优化。
- 路径处理更强大:
Path和Paths类提供了跨平台的路径处理能力,比File构造函数更健壮。 - 支持符号链接:可以更好地处理符号链接等高级文件系统特性。
获取文件内容的大小(内存中)
如果你已经将文件内容读入内存(读入 byte[] 或 String),那么获取其大小就很简单了。

对于 byte[] 数组
// 假设文件内容已经被读入一个 byte[] 数组
byte[] fileContent = getFilesContent(); // 某个方法读取文件内容
// 数组的 length 属性就是字节大小
long sizeInBytes = fileContent.length;
System.out.println("内容大小 (字节): " + sizeInBytes);
对于 String
// 假设文件内容已经被读入一个 String
// 注意:String 的 length() 方法返回的是字符数,不是字节数!
// 如果需要精确的字节数,必须指定字符集。
String fileContentString = "你好,世界"; // 示例字符串
// 错误的方式:获取的是字符数
// int charCount = fileContentString.length();
// 正确的方式:使用指定字符集的字节表示
try {
byte[] bytes = fileContentString.getBytes("UTF-8"); // 或 "GBK", "ISO-8859-1" 等
long sizeInBytes = bytes.length;
System.out.println("内容大小 (字节, UTF-8): " + sizeInBytes);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
总结与对比
| 特性 | java.io.File.length() |
java.nio.file.Files.size(Path) |
|---|---|---|
| Java 版本 | Java 1.0+ (所有版本) | Java 7+ |
| 推荐度 | ⭐⭐☆ (简单但已过时) | ⭐⭐⭐⭐⭐ (现代、推荐) |
| 核心对象 | java.io.File |
java.nio.file.Path |
| 优点 | 极其简单,兼容性好 | API 更丰富,功能更强大,路径处理更健壮 |
| 缺点 | 功能有限,路径处理有坑 | 需要 Java 7 或更高版本 |
| 异常处理 | 可能抛出 SecurityException |
抛出 IOException,更符合 IO 操作的语义 |
最佳实践建议
- 新项目:始终使用
java.nio.file.Files.size(Path),这是当前 Java 生态系统的标准做法。 - 旧项目/兼容性要求:如果必须支持 Java 6 或更早版本,那么使用
java.io.File.length()是唯一的选择。 - 文件不存在:两种方法在文件不存在时都会返回
0,在调用length()或size()之前,最好先用exists()/Files.exists()检查一下,或者使用isFile()/Files.isRegularFile()来确保它是一个常规文件而不是目录。
