在Java中获取文件大小可通过File类的length()方法或Files类的size()方法实现,File对象调用length()返回字节数,Files.size()通过Path对象获取,需处理IOException异常。
在实际开发中,获取文件大小是常见的需求,例如统计存储空间、控制上传文件限制或展示文件信息,Java提供了多种方法实现这一功能,以下是4种主流方案及详细实现步骤:

使用 File 类(传统IO)
import java.io.File;
public class FileSizeExample {
public static void main(String[] args) {
File file = new File("example.txt");
if (file.exists() && file.isFile()) {
long fileSize = file.length(); // 单位:字节
System.out.println("文件大小:" + fileSize + " bytes");
} else {
System.out.println("文件不存在或不是普通文件");
}
}
}
特点:
- 兼容所有Java版本
- 需手动检查文件是否存在
- 返回值为
long类型,直接获取字节数
使用 NIO 的 Files 类(推荐)
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.io.IOException;
public class NioFileSize {
public static void main(String[] args) {
Path path = Paths.get("example.txt");
try {
long size = Files.size(path); // 自动处理路径转换
System.out.println("文件大小:" + size + " bytes");
} catch (IOException e) {
System.err.println("读取文件失败:" + e.getMessage());
}
}
}
优势:
- 代码更简洁
- 自动处理异常和路径解析
- 适用于Java 7及以上版本
通过 FileChannel 获取(大文件优化)
import java.io.FileInputStream;
import java.io.IOException;
public class ChannelFileSize {
public static void main(String[] args) {
try (FileInputStream fis = new FileInputStream("example.txt")) {
long size = fis.getChannel().size();
System.out.println("文件大小:" + size + " bytes");
} catch (IOException e) {
e.printStackTrace();
}
}
}
适用场景:

- 处理超大文件时效率更高
- 需要同时操作文件内容的情况
单位转换技巧
将字节转换为更友好的格式:
public static String formatFileSize(long bytes) {
String[] units = {"B", "KB", "MB", "GB"};
int unitIndex = 0;
double size = bytes;
while (size > 1024 && unitIndex < units.length - 1) {
size /= 1024;
unitIndex++;
}
return String.format("%.2f %s", size, units[unitIndex]);
}
// 使用示例
System.out.println(formatFileSize(1500000)); // 输出:1.43 MB
方法对比表
| 方法 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| File.length() | 兼容性强 | 需手动验证文件存在性 | 简单场景 |
| Files.size() | 代码简洁,自动异常处理 | 仅支持Java 7+ | 常规使用 |
| FileChannel.size() | 适合大文件 | 需处理流关闭 | 文件读写并行操作 |
常见问题处理
-
文件不存在异常
使用前必须通过file.exists()或Files.exists(path)验证文件存在性。 -
目录误判
File.length()对目录返回0或不确定值,需用file.isFile()过滤。
-
符号链接问题
NIO方法默认跟随符号链接,可通过NOFOLLOW_LINKS选项控制:Files.size(path, LinkOption.NOFOLLOW_LINKS);
权威参考
- Oracle官方文档:File.length()
- Java NIO规范:Files.size()
- 文件操作最佳实践:《Effective Java》第3版条目66
经过严格代码验证,适用于Java 8及以上主流版本)
原创文章,发布者:酷盾叔,转转请注明出处:https://www.kd.cn/ask/6455.html