Android中文件扫描功能的实现(非递归)
分类:Uncategorized
阅读 (1,839)
Add comments
4月 032017
需要对Android中的sdcard目录进行扫描,获取文件列表,而且要对文件进行排序
本文使用了非递归的方式进行扫描,用一个栈保存需要扫描的文件夹,用while循环所有目录和文件
排序分为在内部排序和整体排序:
- 内部排序即每扫描到一个文件夹就对这个文件夹内的文件进行排序,然后再扫描他的子文件夹(某些场景会用到这种要求)
- 外部排序即扫描完所有的文件后再进行排序。
根据最后的测试,外部排序速度明显优于内部排序,内部排序的时间约是外部排序的1.3倍。
基于此优化使用排序,如果场景不允许可以先内部排序满足某些条件后再改为外部排序。
下面为文件扫描类的代码FileScanner.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 |
package bcoder.com.androidfunctiontestapplication.utils; import android.util.Log; import java.io.File; import java.util.ArrayList; import java.util.Arrays; import java.util.Comparator; import java.util.Stack; public class FileScanner { public static final String LOG_TAG = "FileScanner"; public ArrayList<String> mFileList = new ArrayList<>(); private boolean mIsRunning = true; public int scanFiles(String path){ mFileList.clear(); File file = new File(path); Stack<File> folderStack = new Stack<>(); folderStack.push(file); long starttime = System.currentTimeMillis(); while (!folderStack.empty()){ if(!mIsRunning){ break; } file = folderStack.pop(); File[] files = file.listFiles(); // 内部排序 Arrays.sort(files, new Comparator<File>() { @Override public int compare(File o1, File o2) { return o1.getName().toLowerCase().compareTo(o2.getName().toLowerCase()); } }); for(int i = 0; i < files.length; i++){ String fullfilepath = files[i].getAbsolutePath(); if(files[i].isDirectory() && !"./".equals(files[i].getName())){ folderStack.push(files[i]); mFileList.add(fullfilepath); } else { mFileList.add(fullfilepath); } } } long timeuse = System.currentTimeMillis() - starttime; Log.d(LOG_TAG, String.format("TimeUse: %d", timeuse)); Arrays.sort(mFileList.toArray()); // 外部排序 mFileList.sort(new Comparator<String>() { @Override public int compare(String o1, String o2) { return o1.compareTo(o2); } }); Log.d(LOG_TAG, String.format("File count: %d", mFileList.size())); // for(int i = 0; i < mFileList.size(); i++){ // Log.d(LOG_TAG, mFileList.get(i)); // } return mFileList.size(); } public void stopScan(){ mIsRunning = false; } } |
github项目地址:https://github.com/wintergoes/AndroidFunctionTestApplication