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

转载自:http://blog.csdn.net/coderyue/article/details/50456735

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

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

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

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

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

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

<code class="hljs java has-numbering"> <span class="hljs-javadoc">/**
     * 读取sd卡上指定后缀的所有文件
     *<span class="hljs-javadoctag"> @param</span> files 返回的所有文件
     *<span class="hljs-javadoctag"> @param</span> filePath 路径(可传入sd卡路径)
     *<span class="hljs-javadoctag"> @param</span> suffere 后缀名称 比如 .gif
     *<span class="hljs-javadoctag"> @return</span>
     */</span>
    <span class="hljs-keyword">public</span> List<File> <span class="hljs-title">getSuffixFile</span>(List<File> files, String filePath, String suffere) {

        File f = <span class="hljs-keyword">new</span> File(filePath);

        <span class="hljs-keyword">if</span> (!f.exists()) {
            <span class="hljs-keyword">return</span> <span class="hljs-keyword">null</span>;
        }

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

        }

        <span class="hljs-keyword">return</span> files;
    }</code>

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

其实调用了Collection.sort()的排序方法就已经是正序排序了,那我们这里只说一下倒叙如何来做,Collection.sort(List list, Comparator

<code class="hljs perl has-numbering">Collections.<span class="hljs-keyword">sort</span>(selectedPositions, new Comparator<String>() {
         <span class="hljs-variable">@Override</span>
         public <span class="hljs-keyword">int</span> compare(String lhs, String rhs) {
                <span class="hljs-keyword">int</span> l = Integer.parseInt(lhs);
                <span class="hljs-keyword">int</span> r = Integer.parseInt(rhs);

                <span class="hljs-regexp">//</span>降序
                <span class="hljs-keyword">if</span>(l > r){
                    <span class="hljs-keyword">return</span> -<span class="hljs-number">1</span>;
                }<span class="hljs-keyword">else</span> <span class="hljs-keyword">if</span>(l < r){
                    <span class="hljs-keyword">return</span> <span class="hljs-number">1</span>;
                }<span class="hljs-keyword">else</span>{
                    <span class="hljs-keyword">return</span> <span class="hljs-number">0</span>;
                }

                /* <span class="hljs-regexp">//</span>升序
         <span class="hljs-keyword">       if</span>(l > r){
                    <span class="hljs-keyword">return</span> <span class="hljs-number">1</span>;
                }<span class="hljs-keyword">else</span> <span class="hljs-keyword">if</span>(l < r){
                    <span class="hljs-keyword">return</span> -<span class="hljs-number">1</span>;
                }<span class="hljs-keyword">else</span> {
                    <span class="hljs-keyword">return</span> <span class="hljs-number">0</span>;
                }<span class="hljs-variable">*/</span>
         }
});</code>

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值