Java中如何准确获取指定文件夹的大小(包括子文件夹)?
- 后端开发
- 2025-09-16
- 9
在Java中,获取文件夹大小可以通过多种方式实现,以下是一些常用的方法:

使用File类和FileOutputStream
- 获取文件夹对象
- 遍历文件夹中的所有文件和子文件夹
- 使用FileOutputStream获取每个文件的大小
- 累加所有文件的大小得到文件夹的总大小
import java.io.File; import java.io.FileInputStream; import java.io.IOException; public class FolderSize { public static void main(String[] args) { File folder = new File("path/to/folder"); long size = getSize(folder); System.out.println("Folder size: " + size + " bytes"); } public static long getSize(File folder) { long size = 0; try { if (folder.isDirectory()) { File[] files = folder.listFiles(); for (File file : files) { size += getSize(file); } } else { FileInputStream fis = new FileInputStream(folder); size = fis.available(); fis.close(); } } catch (IOException e) { e.printStackTrace(); } return size; } }
使用Files类和Files.size()
- 使用Files类获取文件夹路径
- 使用Files.size()方法获取文件夹大小
import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; public class FolderSize { public static void main(String[] args) { Path path = Paths.get("path/to/folder"); try { long size = Files.size(path); System.out.println("Folder size: " + size + " bytes"); } catch (IOException e) { e.printStackTrace(); } } }
使用DirectoryStream
- 使用Files.newDirectoryStream()创建DirectoryStream
- 遍历DirectoryStream中的所有文件
- 使用Files.size()方法获取每个文件的大小
- 累加所有文件的大小得到文件夹的总大小
import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.nio.file.DirectoryStream; import java.nio.file.DirectoryStream.Filter; public class FolderSize { public static void main(String[] args) { Path path = Paths.get("path/to/folder"); try (DirectoryStream<Path> directoryStream = Files.newDirectoryStream(path, new Filter<Path>() { @Override public boolean accept(Path entry) throws IOException { return Files.isRegularFile(entry); } })) { long size = 0; for (Path file : directoryStream) { size += Files.size(file); } System.out.println("Folder size: " + size + " bytes"); } catch (IOException e) { e.printStackTrace(); } } }
使用Java 7的Files.walkFileTree()
- 使用Files.walkFileTree()遍历文件夹
- 使用AtomicLong累加每个文件的大小
- 获取最终的大小
import java.io.IOException; import java.nio.file.*; import java.util.concurrent.atomic.AtomicLong; public class FolderSize { public static void main(String[] args) { Path path = Paths.get("path/to/folder"); AtomicLong size = new AtomicLong(); try { Files.walkFileTree(path, new SimpleFileVisitor<Path>() { @Override public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException { size.addAndGet(Files.size(file)); return FileVisitResult.CONTINUE; } }); System.out.println("Folder size: " + size.get() + " bytes"); } catch (IOException e) { e.printStackTrace(); } } }
使用Java 8的Files.walk()
- 使用Files.walk()遍历文件夹
- 使用Stream.reduce()累加每个文件的大小
- 获取最终的大小
import java.io.IOException; import java.nio.file.*; import java.util.stream.Stream; public class FolderSize { public static void main(String[] args) { Path path = Paths.get("path/to/folder"); try (Stream<Path> stream = Files.walk(path)) { long size = stream .filter(Files::isRegularFile) .mapToLong(Files::size) .sum(); System.out.println("Folder size: " + size + " bytes"); } catch (IOException e) { e.printStackTrace(); } } }
FAQs
Q1:如何处理文件大小超过Long.MAX_VALUE的情况?

A1: 当文件大小超过Long.MAX_VALUE时,可以改为使用BigInteger来存储和计算文件大小,以下是修改后的代码:

import java.io.IOException; import java.math.BigInteger; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; public class FolderSize { public static void main(String[] args) { Path path = Paths.get("path/to/folder"); BigInteger size = BigInteger.ZERO; try { Files.walkFileTree(path, new SimpleFileVisitor<Path>() { @Override public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException { size = size.add(BigInteger.valueOf(Files.size(file))); return FileVisitResult.CONTINUE; } }); System.out.println("Folder size: " + size + " bytes"); } catch (IOException e) { e.printStackTrace(); } } }
Q2:如何处理文件大小为负数的情况?
A2: 文件大小不可能是负数,如果出现这种情况,可能是代码错误或文件系统问题,请检查代码和文件系统以确保没有错误。