3

我需要找出目录中最大文件/文件夹的大小。我已经按照以下方式完成了。

private static Long getSizeofLargestFile(String theRootFolder)
    {
        Long aLargestFileSize = 0L;
        File aRootDir = new File(theRootFolder);
        for (File aFile : aRootDir.listFiles())
        {
            if (aLargestFileSize < aFile.length())
            {
                aLargestFileSize = aFile.length();
            }
        }
        return aLargestFileSize / (1024 * 1024);
    }

还有比这更好的方法吗?

4

5 回答 5

6

不是真的..您必须获取所有文件的大小才能找到最大的文件,这就是您正在做的事情。

我唯一建议反对的是回报中的分裂。如果最大文件小于 1 MB,那么您的方法将返回 0!

于 2013-08-29T12:34:03.380 回答
4

我会说而不是

return aLargestFileSize / (1024 * 1024);

一起去

return aLargestFileSize;

过段时间我会写为什么...

import java.util.*;
import java.lang.*;

class Main
{
    public static void main (String[] args)
    {
        Long aLargestFileSize1 = (1024*1024)+2 + 0L;
        Long aLargestFileSize2 = (1024*1024)+ 0L;

        System.out.println("aLargestFileSize1 final is " + aLargestFileSize1/ (1024 * 1024));
        System.out.println("aLargestFileSize2 final is " + aLargestFileSize2/ (1024 * 1024));

        System.out.println("aLargestFileSize1 new is " + aLargestFileSize1);
        System.out.println("aLargestFileSize2 new is " + aLargestFileSize2);

        }
}

如果您看到输出都给出 1。但是如果您有System.out.println("aLargestFileSize1 final is " + aLargestFileSize1);,那么输出将是,

aLargestFileSize1 new is 1048578
aLargestFileSize2 new is 1048576

意味着第一个文件更大。

因此,只需使用实际数字作为回报。

演示

于 2013-08-29T12:34:40.050 回答
2

我看到一大堆问题:

  • 首先,该部门存在四舍五入问题(请参阅其他答案)
  • 一个空的根目录真的应该返回0吗?考虑-1
  • 如果根目录中只有目录应该返回0-1(见下一点)
  • 您是要递归目录的大小还是要排除它们。
  • 我建议您返回最大的File而不是大小以消除歧义。

如果您不反对使用外部库 Commons IO 有很多正确的方法可以使用它的SizeFileComparator和朋友来做您想做的事情。

您可能想要使用 Commons IO 的另一个原因(除了犯像1024 * 1024舍入问题这样的错误)是我相信最新版本将利用更新的 JVM 功能,并且它还提供递归目录大小(即最大的文件可能是另一个目录)。

如果您不想使用我建议的库,请至少查看其代码以弄清楚如何做事。

于 2013-08-29T12:34:13.540 回答
1

Java 7 提供了新的 java.nio.* 类,包括 FileVisitor: http ://docs.oracle.com/javase/tutorial/essential/io/walk.html

我已经使用了它们,但我不能说哪种解决方案更好。我认为你应该保留你的解决方案,因为它更好地阅读。

于 2013-08-29T12:33:46.373 回答
0

这对我来说看起来不错,有几个可能的改进。

首先,您似乎对探索子目录不感兴趣。如果确实如此,我会传递一个FileFilterto listFiles- 这将允许您轻松过滤掉所有isFile()方法返回的实例false

其次,我不会将返回值除以 1024 * 1024。返回字节数,让调用者自己进行转换。原因是如果没有文件大于 1024 * 1024 字节,您的方法将返回 0l。

于 2013-08-29T12:39:20.077 回答