Android本地文件查找实现

314 阅读3分钟

在日常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 +

                  '}';

      }

  }