你的Sdcard比较大,且目录树分支很多的话,用ForkJoin的方式去查找,速度会比传统的递归快。类似:
public class FileUtils extends RecursiveTask{
private File mFile;
public FileUtils(File f){
mFile = f;
//System.out.println("FileUtils file "+f);
}
@Override
protected Long compute() {
//System.out.println("compute ... start");
long mSize = 0;
if (mFile != null){
if (mFile.isDirectory()){
ArrayList array = new ArrayList();
File [] fileSubs = mFile.listFiles();
if(fileSubs != null) {
for (File f : fileSubs) {
if (f.isFile()) {
mSize += f.length();
} else {
array.add(new FileUtils(f));
}
}
for (FileUtils fu : invokeAll(array)) {
long size = fu.join();
mSize += size;
//System.out.println("compute invokeAll file=" + fu + ", size=" + size + ", mSize=" + mSize);
}
}
}else{
mSize +=mFile.length();
}
}
return mSize;
}
@Override
public String toString() {
return String.valueOf(mFile);
}
}
调用:
ForkJoinPool pool = new ForkJoinPool();
long start = System.currentTimeMillis();
File file = new File("/sdcard");
long total = pool.invoke(new FileUtils(file));
long end = System.currentTimeMillis();
System.out.println("Total Size: " + total);
System.out.println("Time taken: " + (end - start));
PS:尽量不要在compute里面打印log,严重影响性能。