获取到手机里面的word、PPT、PDF、txt等文档文件的信息,存储到list里面。使用递归方法耗时太长,不知道有没有耗时短的方法。
api就那么几个读取的方法,只能递归,要有简洁的话,也不至于每次手机清理内存的时候查询各个软件大小那么慢
你的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,严重影响性能。