Java案例如何获取文件大小?

wen java案例 18

本文目录导读:

Java案例如何获取文件大小?

  1. 使用 File.length() 方法(最常用)
  2. 使用 Files.size() 方法(Java 7+)
  3. 使用 FileChannel.size() 方法
  4. 获取目录大小(递归计算)
  5. 完整的工具类示例
  6. 注意事项
  7. 推荐使用

在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));
    }
}

注意事项

  1. 返回值单位:所有方法返回的都是字节(bytes)大小
  2. 文件不存在File.length() 返回 0,Files.size() 抛出异常
  3. 性能File.length() 最快,Files.size() 次之
  4. 大文件File.length() 返回 long 类型,最大支持 9EB
  5. 文件锁定FileChannel.size() 可以获取被其他进程锁定的文件大小

推荐使用

  • 简单场景:使用 File.length()
  • Java 7+:使用 Files.size()
  • 需要格式化显示:结合 formatFileSize() 方法
  • 获取目录大小:使用递归方法

抱歉,评论功能暂时关闭!