美文网首页Android开发
Android 读取SD卡指定后缀的所有文件

Android 读取SD卡指定后缀的所有文件

作者: jinguangyue | 来源:发表于2016-04-15 12:45 被阅读1484次

一 读取文件
在实际开发过程中有各种各样的需求,不知道你们有没有遇到过类似的需求,几个Fragment切换, 数据是读取SD卡中的json文件或者xml文件,那每次点击Fragment就要读取一次文件,虽然java读取文件很快,不过处理不当也需要200ms如果使用String来存储,这里我使用StringBuilder来存储读出来的内容 , 极大的增加了读取速度:

public String readTxtFile(String strFilePath) {
        String path = strFilePath;
        StringBuilder builder = new StringBuilder();
        //打开文件
        File file = new File(path);
        //如果path是传递过来的参数,可以做一个非目录的判断
        if (file.isDirectory()) {
            Log.d("TestFile", "The File doesn't not exist.");
        } else {
            try {
                InputStream instream = new FileInputStream(file);
                if (instream != null) {
                    InputStreamReader inputreader = new InputStreamReader(instream);
                    BufferedReader buffreader = new BufferedReader(inputreader);
                    String line;
                    //分行读取
                    while ((line = buffreader.readLine()) != null) {
                        builder.append(line + "\n");
                    }
                    instream.close();
                }
            } catch (java.io.FileNotFoundException e) {
                Log.d("TestFile", "The File doesn't not exist.");
            } catch (IOException e) {
                Log.d("TestFile", e.getMessage());
            }
        }
        return builder.toString();
    }

二 删除目录以及目录下的文件

大家都知道删除一个文件只需调用 file.delete(); 但是删除文件夹呢, 只需调用下面的方法, 算是递归删除:

/**
     * 删除目录(文件夹)以及目录下的文件
     * @param   sPath 被删除目录的文件路径
     * @return  目录删除成功返回true,否则返回false
     */
    public boolean deleteDirectory(String sPath) {
        //如果sPath不以文件分隔符结尾,自动添加文件分隔符
        if (!sPath.endsWith(File.separator)) {
            sPath = sPath + File.separator;
        }
        File dirFile = new File(sPath);
        //如果dir对应的文件不存在,或者不是一个目录,则退出
        if (!dirFile.exists() || !dirFile.isDirectory()) {
            return false;
        }
        flag = true;
        //删除文件夹下的所有文件(包括子目录)
        File[] files = dirFile.listFiles();
        for (int i = 0; i < files.length; i++) {
            //删除子文件
            if (files[i].isFile()) {
                flag = deleteFile(files[i].getAbsolutePath());
                if (!flag) break;
            } //删除子目录
            else {
                flag = deleteDirectory(files[i].getAbsolutePath());
                if (!flag) break;
            }
        }
        if (!flag) return false;
        //删除当前目录
        if (dirFile.delete()) {
            return true;
        } else {
            return false;
        }
    }

三 读取SD卡指定后缀的所有文件
在实际开发过程中遇到了这样的需求, 做了一个gif的阅览册, 意思就是说要读取sd卡上所有的gif文件, 包括微信,微博等等保存下来的,实际上原理和删除文件差不多, 递归的调用删除, 这里贴上我封装好的方法供大家使用:

 /**
     * 读取sd卡上指定后缀的所有文件
     * @param files 返回的所有文件
     * @param filePath 路径(可传入sd卡路径)
     * @param suffere 后缀名称 比如 .gif
     * @return
     */
    public List<File> getSuffixFile(List<File> files, String filePath, String suffere) {

        File f = new File(filePath);

        if (!f.exists()) {
            return null;
        }

        File[] subFiles = f.listFiles();
        for (File subFile : subFiles) {
            if(subFile.isFile() && subFile.getName().endsWith(suffere)){
                files.add(subFile);
            } else if(subFile.isDirectory()){
                getSuffixFile(files, subFile.getAbsolutePath(), suffere);
            } else{
                //非指定目录文件 不做处理
            }

        }

        return files;
    }

四 另外附上集合中的排序正序和倒叙方法

其实调用了Collection.sort()的排序方法就已经是正序排序了,那我们这里只说一下倒叙如何来做,Collection.sort(List<T> list, Comparator<? super T> comparator) 方法有2个参数, 第一个为你要排序的List, 第二个可理解为读取出来的俩个对象的比较,下面看下实例源码:

Collections.sort(selectedPositions, new Comparator<String>() {
                                    @Override
                                    public int compare(String lhs, String rhs) {
                                        int l = Integer.parseInt(lhs);
                                        int r = Integer.parseInt(rhs);

                                        //降序
                                        if(l > r){
                                            return -1;
                                        }else if(l < r){
                                            return 1;
                                        }else{
                                            return 0;
                                        }

                                       /* //升序
                                        if(l > r){
                                            return 1;
                                        }else if(l < r){
                                            return -1;
                                        }else {
                                            return 0;
                                        }*/
                                    }
                                });

这里我要比较的是一个整型的list, compare方法有3个返回值,负整数,0和正整数,我在代码里面加了注释,用的伙伴应该能看懂啦。

相关文章

网友评论

    本文标题:Android 读取SD卡指定后缀的所有文件

    本文链接:https://www.haomeiwen.com/subject/udrnlttx.html