转载自: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和正整数,我在代码里面加了注释,用的伙伴应该能看懂啦。