天天看點

批量檔案的操作

 先講下,因為現在有關布局控件什麼的文章已經很多了,基本都能在網上找到

解決方法,從今以後,小馬會寫一些自己在實際開發過程中用到過的方法及碰到的問

題,小馬所犯錯誤之處會用注釋标出,以便提醒朋友們不要犯小馬這樣低級的錯誤,

今天講下批量檔案的操作及單個檔案的操作,不多廢話,直接看代碼:

/** 

 * @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,如需轉載請自行聯系原作者