首页新闻找找看学习计划

android如何快速获取SDcard里的文件列表信息

0
悬赏园豆:20 [已解决问题] 解决于 2017-11-10 13:35

获取到手机里面的word、PPT、PDF、txt等文档文件的信息,存储到list里面。使用递归方法耗时太长,不知道有没有耗时短的方法。

风雨同行的主页 风雨同行 | 初学一级 | 园豆:182
提问于:2016-09-11 21:53
< >
分享
最佳答案
0

api就那么几个读取的方法,只能递归,要有简洁的话,也不至于每次手机清理内存的时候查询各个软件大小那么慢

收获园豆:10
程序员大亨 | 菜鸟二级 |园豆:276 | 2017-02-24 17:55
其他回答(1)
0

你的Sdcard比较大,且目录树分支很多的话,用ForkJoin的方式去查找,速度会比传统的递归快。类似:

public class FileUtils extends RecursiveTask<Long>{

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<FileUtils> array = new ArrayList<FileUtils>();
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,严重影响性能。

收获园豆:10
安林__yzyeilin | 园豆:145 (初学一级) | 2017-11-09 18:47
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册