确定Android SD卡上目录大小的最快方法

Mel*_*var 5 java android

确定Android上(平坦的,非嵌套的)目录大小的最快,最简单的方法是什么?使用File对象获取文件列表并对其进行枚举以计算大小是极其缓慢的-当然,有更好的方法吗?

(我知道我可以使用线程在后台计算大小,但是在这种情况下,这不是理想的解决方案)

Jas*_*ank 1

我不知道这对你来说是否算是“非黑客”,但如果你不想重新发明轮子,你可以使用 Linux 命令du。这是其联机帮助页中的一个剪辑:

NAME
       du - estimate file space usage

SYNOPSIS
       du [OPTION]... [FILE]...

DESCRIPTION
       Summarize disk usage of each FILE, recursively for directories.
Run Code Online (Sandbox Code Playgroud)

-c特别是您应该感兴趣的参数-s:

$ du -sc /tmp
164    /tmp
164    total
$
Run Code Online (Sandbox Code Playgroud)

它输出的数字是目录中的总字节数。我不知道您是否想要以字节为单位的大小或人类可读的格式,但-h如果您也需要的话,可以为您提供。

您必须读取命令的输出。这个问题已经介绍了捕获命令输出,我将大量借用该问题来提供以下示例:

public String du(String fileName) {
    Class<?> execClass = Class.forName("android.os.Exec");
    Method createSubprocess = execClass.getMethod("createSubprocess", String.class, String.class, String.class, int[].class);
    int[] pid = new int[1];
    FileDescriptor fd = (FileDescriptor)createSubprocess.invoke(null, "/system/bin/du -sc", fileName, null, pid);

    BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(fd)));
    String output = "";
    try {
        String line;
        while ((line = reader.readLine()) != null) {
            output += line + "\n";
        }
    }
    catch (IOException e) {}
    return output;
}
Run Code Online (Sandbox Code Playgroud)

从那里,您需要解析代表总大小的数值的输出,我将其省略,因为它应该相当微不足道。或者,您可以将其放入du()函数中,并使函数返回 anint而不是 a String。