在日常Android开发中离不开加载本地所有文件和文件查找工具的实现。之前在做项目时刚好有个本地文件查找的需求,就写了个本地查找文件的工具类,分享给大家。
1、Android本地文件查找方法耗时操作需要使用异步方法实现。
new Thread(new Runnable() {
@Override
public void run() {
List<FileBean> fileList = FileManagerUtils.getFileList(".xls"); // 获取文件列表
// 检查是否没有找到相关的.xls格式文件
if (fileList.size() == 0) {
log.e("tag","没有找到相关的.xls格式文件")
return
}
//查询到文件后的操作实现方法
...
}
}).start();
2、查找本地文件工具类实现
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
/\*\*
\* 用于本地文件查找使用的工具类
\*/
public class FileManagerUtils {
private static Lock lock = new ReentrantLock();
private static List<FileBean> lstFile;
/\*\*
\* 判断文件是否存在
\*
\* @param path 文件的路径
\* @return 如果文件存在返回true,否则返回false
\*/
private static boolean isExists(String path) {
File file = new File(path);
return file.exists();
}
/\*\*
\* 获取本地xls文件列表信息
\* 从SD卡的根目录开始扫描
\* @param format 要扫描的文件格式
\* 注意安卓版本的权限申请,如果权限申请不对此方法会返回为空,但是文件确实存在的问题
\*/
public static List<FileBean> getFileList(String format) {
lock.lock();
String fileName = getSDCardPath();// 从根目录开始扫描
lstFile = new ArrayList<FileBean>();
GetFiles(fileName, format, true);
lock.unlock();
return lstFile;
}
/\*\*
\* 获取指定路径下的xls文件列表信息
\*
\* @param filepath 要扫描的文件路径
\* @param format 要扫描的文件格式
\* @return 返回找到的文件列表
\* 注意安卓版本的权限申请,如果权限申请不对此方法会返回为空,但是文件确实存在的问题
\*/
public static List<FileBean> getFileList(String filepath,String format) {
lock.lock();
lstFile = new ArrayList<FileBean>();
GetFiles(filepath, ".xls", true);
lock.unlock();
return lstFile;
}
/\*\*
\* 搜索指定目录下的文件,根据扩展名筛选,可选择是否递归搜索
\*
\* @param Path 要搜索的目录路径
\* @param Extension 要筛选的文件扩展名
\* @param IsIterative 是否递归搜索子目录
\*/
private static void GetFiles(String Path, String Extension, boolean IsIterative) {
File\[\] files = new File(Path).listFiles();
for (int i = 0; i < files.length; i++) {
File f = files\[i\];
if (f.isFile()) {
// 判断文件扩展名是否匹配
if (f.getPath().substring(f.getPath().length() - Extension.length()).equals(Extension)) {
lstFile.add(new FileBean(f.getPath(), f.getName()));
}
if (!IsIterative) {
break;
}
} else if (f.isDirectory() && f.getPath().indexOf("/.") == -1) {
// 忽略隐藏文件夹和文件
GetFiles(f.getPath(), Extension, IsIterative);
}
}
}
/\*\*
\* 判断SD卡是否存在,并返回SD卡的Download目录路径
\*
\* @return 返回SD卡Download目录的路径,若SD卡不存在则返回null
\*/
private static String getSDCardPath() {
File sdDir = null;
// String sdDir = null;
boolean sdCardExist = Environment.getExternalStorageState().equals(
android.os.Environment.MEDIA\_MOUNTED);// 判断sd卡是否存在
if (sdCardExist) {
// 获取SD卡Download目录的路径,可以指定目录
// sdDir = Environment.getExternalStorageDirectory().getPath() + "/Download" ;
// 获取根目录
sdDir = Environment.getExternalStorageDirectory();// 获取根目录
}
return sdDir;
}
}
3、文件实体实现
public class FileBean {
private String path; // 文件路径
private String name; // 文件名
private long size; // 文件大小,单位为字节
/\*\*
\* 完全构造函数
\* @param path 文件的路径
\* @param name 文件的名称
\* @param size 文件的大小,单位为字节
\*/
public FileBean(String path, String name, long size) {
this.path = path;
this.name = name;
this.size = size;
}
/\*\*
\* 简单构造函数,不包含文件大小信息。
\* @param path 文件的路径
\* @param name 文件的名称
\*/
public FileBean(String path, String name) {
this.path = path;
this.name = name;
}
public String getPath() {
return path;
}
public void setPath(String path) {
this.path = path;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public long getSize() {
return size;
}
public void setSize(long size) {
this.size = size;
}
@Override
public String toString() {
return "FileBean{" +
"path:'" + path + '\\'' +
", name:'" + name + '\\'' +
", size:" + size +
'}';
}
}