天天看点

批量文件的操作

 先讲下,因为现在有关布局控件什么的文章已经很多了,基本都能在网上找到

解决方法,从今以后,小马会写一些自己在实际开发过程中用到过的方法及碰到的问

题,小马所犯错误之处会用注释标出,以便提醒朋友们不要犯小马这样低级的错误,

今天讲下批量文件的操作及单个文件的操作,不多废话,直接看代码:

/** 

 * @Title: DeleteFile.java 

 * @Description: 文件、文件夹操作类 

 * @author MZH 

 * @version 1.0  一般自己的工具辅助类,我个人习惯加版本号,得考虑到后期维护,方便标记 

 */ 

public class FileUtils{ 

    /** 

     * 一般情况下,小马希望大家养成好习惯,构造方法,一般留个空的,方便扩展 

     */ 

    public FileUtils(){ 

    } 

     * 删除文件 

     * @param file 

     * @return 

    public boolean deleteFile(File file) { 

        boolean result = false; 

        if (file != null) { 

            try { 

                File file2 = file; 

                file2.delete(); 

                result = true; 

            } catch (Exception e) { 

                e.printStackTrace(); 

                result = false; 

            } 

        } 

        return result; 

     *  删除文件夹 

     * @param folder   

     * 因为涉及到一个文件夹下有文件也有文件夹的情况,所以写个函数,以后直拿来用 

    public boolean deleteFolder(File folder) { 

        try { 

            //取得文件下所有信息:包括文件及文件夹名称 

            String childs[] = folder.list(); 

  //小马的错误:是字符串数组,没习惯判断length大小,希望朋友们不要忘了判断长度,养成好的习惯 

            if (childs == null || childs.length <= 0) {   

                if (folder.delete()) { 

                    result = true; 

                } 

            } else { 

                for (int i = 0; i < childs.length; i++) { 

                    String childName = childs[i]; 

                    String childPath = folder.getPath() + File.separator 

                            + childName; 

                    File filePath = new File(childPath); 

//小马的错误:只判断是否存在,未判断是文件还是文件夹,这样会漏掉一大

//部分文件的操作,所以isFile一定要加 

                    if (filePath.exists() && filePath.isFile()) {

                        if (filePath.delete()) { 

                            result = true; 

                        } else { 

                            result = false; 

                            break; 

                        } 

                        //如果是文件夹的操作,此及写递归删除,调用自己 

                    } else if (filePath.exists() && filePath.isDirectory()) { 

                        if (deleteFolder(filePath)) { 

                    } 

                folder.delete(); 

        } catch (Exception e) { 

            e.printStackTrace(); 

            result = false; 

     * 实现清空所有Temp文件 

     *  

     * @return 是否删除成功 

    private boolean deleteTempFiles() { 

        //ApplicationData myApp = new ApplicationData();   

//这一步是小马犯的错误,因为继承Application的类是可以这样new对象,

//但不建议直接new,多分内存,而且还是全局的,浪费 

        //此处直接写getApplication会报错,因为需要上下文件,

//所以这时小马说的扩展构造方法就有用了,可以在new本类对象时会了Context对象哦,吼吼 

        //ApplicationData myApp = (ApplicationData)getApplication(); 

        FileUtils df = new FileUtils(); 

        File file = null; 

        if (Environment.getExternalStorageState().equals( 

                Environment.MEDIA_MOUNTED)) { 

            //因为类似临时文件,一般都在最开始创建,最后删除,

//所以小马把建议类似操作放在Application里面操作,取值操作都方便 

            file = new File(TEMP); //TEMP为临时文件存放的文件夹路径 

        return df.deleteFolder(file); 

     * 保存时将临时文件夹下所有文件移至目标文件夹下 

     * @param oldLocation  源文件夹 

     * @param newLocation  目标文件夹 

     * @throws IOException  异常 

     * @throws NoSpaceIOException  磁盘空间不足 小马自定义的异常类,可以跳过 

    public void moveFile(File oldLocation, File newLocation) 

            throws IOException, NoSpaceIOException { 

        boolean isMkdirs = false; 

        File file = new File(newLocation.getPath()+File.separator+"此处拼接文件名"); 

        if(!file.exists()){ 

            isMkdirs = file.mkdirs(); 

            if(isMkdirs){ 

                String childs[] = oldLocation.list(); 

                if(oldLocation != null && oldLocation.exists()){ 

                    for(int i=0;i<childs.length;i++){ 

                        String childName = childs[i]; 

                        String childPath = oldLocation.getPath()+File.separator+childName; 

                        File filePath = new File(childPath); 

                        if(filePath.exists() && filePath.isFile()){ 

                            FileInputStream fis = null; 

                            FileOutputStream fos = null; 

                            try { 

                                fis = new FileInputStream(filePath); 

                                //下面这句中的false是用来判断是否是append追加状态,

//不懂的朋友们可以直接访问:http://developer.android.com/reference/java/io/File.html 

                                //来查看相关方法参数的具体涵义,吼吼 

                                fos = new FileOutputStream(new File(file.getPath()+File.separator+childName),false); 

                                byte[] buff = new byte[8192]; 

                                int readIn ; 

                                //此处注意下:read方法中的参数如果不写的话,会读不到文件内容,

//报异常,小马犯过的低级错误,希望你不要犯啦 

                                while((readIn = fis.read(buff,0,buff.length))!= -1){ 

                                    fos.write(buff,0,readIn); 

                                } 

                                fos.flush(); 

                            } catch (Exception e) { 

                                e.printStackTrace(); 

                                /*if (android.os.Environment.getExternalStorageState().equals( 

                                        android.os.Environment.MEDIA_MOUNTED)) { 

                                    // 如果有sdcard,磁盘空间是否满了 

                                    Log.d(TAG, "DMUtils>>>sdcard is ok!"); 

                                    // No space left on device 

                                    if (ex.getMessage() != null 

                                            && ex.getMessage().indexOf( 

                                                    "No space left on device") != -1) { 

                                        // 磁盘空间满 

                                        throw new NoSpaceIOException(ex.getMessage()); 

                                    } 

                                } else { 

                                    // 文件保存失败应该检查sd卡 

                                    Log.d(TAG, "DMUtils>>>sdcard is error!state: " 

                                            + android.os.Environment.getExternalStorageState()); 

                                throw new IOException(ex.getMessage() 

                                        + " IOException when transferring " 

                                        + oldLocation.getPath() + " to " 

                                        + newLocation.getPath());*/ 

                            }finally{ 

                                //大伙应该很熟悉了吧?小马一朋友犯过的错误,未关闭流,

//导致生成的文件本来是KB的却成了MB的文件,所以一定注意打开什么就关闭什么 

                                try { 

                                    if(fis!=null){ 

                                        fos.close(); 

                                    if(fos!=null){ 

                                } catch (Exception e2) { 

                                    e2.printStackTrace(); 

                            } 

                        /* 

                         * 因为此处小马用的是一个文件夹下的文件操作,并不包含子文件夹,

* 所以:如果有朋友要用子文件夹操作的话可激活此处递归处理哦 

                         */ 

                        /*else if(filePath.exists() && filePath.isDirectory()){ 

                                moveFile(filePath,new File("此处路径从全局文件中取就OK了")); 

                        }*/ 

                }    

上面代码中的方法,朋友们可以直接使用,但小马多嘴讲下:不要直接把代码COPY到你使用的工程中,因为那样本就没经过思考,以后碰到类似的问题也就不会解决了,小马很菜,这些代码如果我自己写不出来,就用个笨的方法,一边看一边想,再不行就照抄一边,眼过十遍不如手过一遍听过吧?想通了也就最好了,不会的时候再反过来看下就可以了,所以尽量不使用COPY的方式哦,吼吼。。O_O

      本文转自华华世界 51CTO博客,原文链接:http://blog.51cto.com/mzh3344258/741315,如需转载请自行联系原作者