Java中如何准确查询指定目录及其子目录的总大小?
- 后端开发
- 2025-10-23
- 7
在Java中,查看目录大小可以通过多种方式实现,以下是一些常用的方法:

使用java.io.File类
java.io.File类提供了获取文件或目录大小的方法,以下是一个示例代码,展示如何使用java.io.File类来查看目录大小:
import java.io.File; public class DirectorySize { public static void main(String[] args) { File directory = new File("C:/path/to/directory"); long size = getDirectorySize(directory); System.out.println("Directory size: " + size + " bytes"); } public static long getDirectorySize(File directory) { long size = 0; File[] files = directory.listFiles(); if (files != null) { for (File file : files) { if (file.isDirectory()) { size += getDirectorySize(file); } else { size += file.length(); } } } return size; } }
使用java.nio.file.Files类
从Java 7开始,java.nio.file.Files类提供了更加强大的文件操作功能,以下是一个使用Files类查看目录大小的示例:
使用java.nio.file.Files类和递归
以下是一个使用Files类和递归方法查看目录大小的示例:

import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.nio.file.attribute.BasicFileAttributes; public class DirectorySize { public static void main(String[] args) { Path path = Paths.get("C:/path/to/directory"); try { long size = Files.walkFileTree(path, new SimpleFileVisitor<Path>() { @Override public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException { return FileVisitResult.CONTINUE; } @Override public FileVisitResult visitFileFailed(Path file, IOException exc) throws IOException { return FileVisitResult.CONTINUE; } @Override public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException { return FileVisitResult.CONTINUE; } @Override public FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOException { return FileVisitResult.CONTINUE; } }).mapToLong(java.nio.file.Path::toFile).mapToLong(File::length).sum(); System.out.println("Directory size: " + size + " bytes"); } catch (IOException e) { e.printStackTrace(); } } }
FAQs
Q1:如何处理目录中存在隐藏文件的情况?
A1: 在上述示例中,隐藏文件(以点开头的文件)也会被计算在内,如果你想要排除隐藏文件,可以在getDirectorySize方法中添加一个条件来检查文件名是否以开头。
Q2:如何处理目录中存在符号链接的情况?
A2: 在上述示例中,符号链接(软链接)会被视为普通文件处理,如果你想要排除符号链接,可以在Files.walkFileTree方法中添加一个过滤器来排除符号链接。
