杰瑞科技汇

Java中如何获取file文件大小?

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

Java中如何获取file文件大小?-图1
(图片来源网络,侵删)

核心方法

获取文件大小的核心思路是:获取一个代表文件的 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 流资源,但在处理文件路径时,如果路径来自不可靠的输入,可能会抛出 SecurityExceptiontry-with-resources 主要用于管理资源(如流),但养成良好的异常处理习惯总是好的。

Java中如何获取file文件大小?-图2
(图片来源网络,侵删)

使用 java.nio.file.Pathjava.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 类还提供了读写、复制、移动、检查属性等大量实用方法。
  • 更好的性能:底层实现更优化。
  • 路径处理更强大PathPaths 类提供了跨平台的路径处理能力,比 File 构造函数更健壮。
  • 支持符号链接:可以更好地处理符号链接等高级文件系统特性。

获取文件内容的大小(内存中)

如果你已经将文件内容读入内存(读入 byte[]String),那么获取其大小就很简单了。

Java中如何获取file文件大小?-图3
(图片来源网络,侵删)

对于 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 操作的语义

最佳实践建议

  1. 新项目:始终使用 java.nio.file.Files.size(Path),这是当前 Java 生态系统的标准做法。
  2. 旧项目/兼容性要求:如果必须支持 Java 6 或更早版本,那么使用 java.io.File.length() 是唯一的选择。
  3. 文件不存在:两种方法在文件不存在时都会返回 0,在调用 length()size() 之前,最好先用 exists() / Files.exists() 检查一下,或者使用 isFile() / Files.isRegularFile() 来确保它是一个常规文件而不是目录。
分享:
扫描分享到社交APP
上一篇
下一篇