1. 概述

在这个快速教程中,我们将学习如何使用Java获取文件的大小 - 包括Java 7、新的Java 8以及Apache Commons IO库。

最后,我们还将获得一个更易读的人类可理解的文件大小表示法。

2. 标准Java I/O

让我们从一个简单的示例开始,使用[File.length()](https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/io/File.html#length()"API用法")方法来计算文件的大小:

private long getFileSize(File file) {
    long length = file.length();
    return length;
}

我们可以相对简单地测试我们的实现:

@Test
public void whenGetFileSize_thenCorrect() {
    long expectedSize = 12607;
 
    File imageFile = new File("src/test/resources/image.jpg");
    long size = getFileSize(imageFile);
 
    assertEquals(expectedSize, size);
}

请注意,默认情况下,文件大小是以字节为单位计算的。

3. 使用Java NIO

接下来,我们将看看如何使用NIO库来获取文件的大小。

在下面的例子中,我们将使用[FileChannel.size()](https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/nio/channels/FileChannel.html#size()"API用法") API 来以字节为单位获取文件的大小:

@Test
public void whenGetFileSizeUsingNioApi_thenCorrect() throws IOException {
    long expectedSize = 12607;
 
    Path imageFilePath = Paths.get("src/test/resources/image.jpg");
    FileChannel imageFileChannel = FileChannel.open(imageFilePath);

    long imageFileSize = imageFileChannel.size();
    assertEquals(expectedSize, imageFileSize);
}

4. 使用Apache Commons IO

接下来,我们将学习如何使用Apache Commons IO 获取文件大小。在以下示例中,我们直接使用[FileUtils.sizeOf()](https://commons.apache.org/proper/commons-io/javadocs/api-2.5/org/apache/commons/io/FileUtils.html#sizeOf\(java.io.File\)"API用法")来获取文件大小:

@Test
public void whenGetFileSizeUsingApacheCommonsIO_thenCorrect() {
    long expectedSize = 12607;
 
    File imageFile = new File("src/test/resources/image.jpg");
    long size = FileUtils.sizeOf(imageFile);
 
    assertEquals(expectedSize, size);
}

注意,对于受安全限制的文件,FileUtils.sizeOf()将报告文件大小为零。

5. 人类可读的文件大小

最后,我们将看到如何使用Apache Commons IO 获取一个更用户友好的文件大小表示,而不仅仅是字节:

@Test
public void whenGetReadableFileSize_thenCorrect() {
    File imageFile = new File("src/test/resources/image.jpg");
    long size = getFileSize(imageFile);
 
    assertEquals("12 KB", FileUtils.byteCountToDisplaySize(size));
}

6. 在Java中以MB、KB和GB获取文件大小

为了在Java中获取文件的大小(以MB、KB和GB为单位),我们需要理解这些单位之间的关系。我们知道:

  • 1千字节(KB)= 1,024字节
  • 1兆字节(MB)= 1,024 KB
  • 吉字节(GB)= 1,024 MB

然后我们可以得出以下数学公式,将较低的数据大小级别(如字节)转换到较高级别(如千字节),然后再转换到更高级别(如兆字节):

  • 千字节 = 字节 / 1024
  • 兆字节 = 千字节 / 1024
  • 吉字节 = 兆字节 / 1024

让我们创建一个Java方法,使用上述数学公式:

private void getSizeOfFile(String pathname) {
    File file = new File(pathname);
    if (file.exists()) {
        // File size in bytes
        long bytes = file.length();
        double kilobytes = (double) bytes / 1024;
        double megabytes = kilobytes / 1024;
        double gigabytes = megabytes / 1024;
        System.out.println("File size in bytes: " + bytes + " bytes");
        System.out.println("File size in kilobytes: " + kilobytes + " KB");
        System.out.println("File size in megabytes: " + megabytes + " MB");
        System.out.println("File size in gigabytes: " + gigabytes + " GB");
    } else {
        System.out.println("File not found.");
    }
}

这段代码首先检查文件是否存在,如果存在,它会计算并打印其大小,包括字节、千字节、兆字节和吉字节。

7. 总结

在这篇教程中,我们展示了使用Java和Apache Commons IO在文件系统中计算文件大小的示例。

这些示例的实现可以在GitHub项目中找到 - 这是一个基于Maven的项目,所以导入并运行起来应该非常容易。