1. 程式人生 > >Android的File類處理

Android的File類處理

先了解下Java中的File類

 Java中對檔案的操作也進行了物件的封裝,這個操作檔案的類就是File類,File提供了豐富的api來進行檔案的操作,比如常見的createNewFile(),mkdir(),mkdirs(),exists(),isFile(),isDictory(),renameto(),delete(),getName(),getPath()....方法比較多,讀者可以自行通過api文件檢視,同樣這一套的檔案操作在Android中也適用。

/**
*這裡通過將給定路徑名字串轉換為抽象路徑名來建立一個新File例項。
*然後執行file.createNewFile();如果該檔案存在,則建立失敗,不存在則建立,返回一個boolean值
*/
File file=new File(String pathname);

 

/**
*這裡根據parent抽象路徑名和child路徑名字串建立一個新File例項。
*執行file.createNewFile();如果parent抽象路徑名不存在,或者檔案已經建立過,依然不能建立成功。
*/
File file=new File(File parent,String child);
/**
*根據 parent 路徑名字串和 child 路徑名字串建立一個新 File 例項。
*執行file.createNewFile();如果parent抽象路徑名不存在,或者檔案已經建立過,依然不能建立成功。
*/
File file=new File(String parentpath,String child);

 

File常用方法

  1. createNewFile();如果檔案已經存在,則建立失敗,否則成功建立,還有其他可能
  2. mkdir();建立資料夾,注意:如果建立目標資料夾的父級目錄不存在,就會建立失敗
  3. mkdirs();建立多級目錄,父級檔案目錄不存在的話,會自動建立父級目錄。
  4. isFile();判斷是否是一個檔案
  5. isDictory();判斷是否是一個資料夾
  6. delete();刪除檔案或者資料夾,注意要是刪除資料夾的時候,資料夾裡還有檔案或者資料夾,則不能刪除,意思是隻能刪除一個空資料夾。
  7. exists();判斷檔案或者資料夾是否存在
  8. getName();獲取檔案或者資料夾的名稱
  9. getPath();獲取相對路徑
  10. getAbsolutePath();獲取絕對路徑
  11. length();獲取檔案或者資料夾的長度

Android中的File儲存

  • 在介紹如何在Android平臺下進行檔案的讀取之前,有必要了解Android平臺下的資料儲存規則。在其他的作業系統如Windows 平臺下,應用程式可以自由地或者在特定的訪問許可權基礎上訪問或修改其他應用程式名下的檔案等資源,而在Android平臺下,一個應用程式中所有的資料都是私有的。
  • 當應用程式被安裝到系統中後,其所在的包會有一個資料夾用於存放自己的資料,只有這個應用程式才有對這個資料夾的寫入許可權,這個私有的資料夾位於Android系統的/data/data/<應用程式包名>目錄下,其他的應用程式都無法再這個資料夾中寫入資料。除了存放私有的資料資料夾外,應用程式也具有SD卡的寫入許可權。
  • 使用檔案I/O 方法可以直接往手機中儲存資料,預設情況下這些檔案不可以被其他的應用程式訪問。Android平臺支援 java平臺下的 檔案I/O操作, 主要使用FileInputStream 和 FileOutputStream 這兩個類來實現檔案的儲存與讀取。獲取這兩個類物件的方式有兩種。
  1. 第一種方式就是像Java平臺下的實現方式一樣通過構造器直接建立,如果需要向開啟的檔案末尾寫入資料,可以通過使用構造器FileOutputStream(File file, boolean append)將 append設定為true來實現。不過需要注意的是採用這種方式獲得FileOutputStream 物件時如果檔案不存在或不可寫入時,會丟擲 FileNotFoundException 異常。
  2. 第二種獲取 FileInputStream 和 FileOutputStream 物件的方式是呼叫 Context.openFileInput 和 Context.openFileOutput兩個方法來建立。
  • fileList() 搜尋應用程式私有資料夾下的私有檔案,返回所有檔名的String陣列
  • deleteFile(String fileName) 刪除指定檔名的檔案,成功返回true,失敗返回false

在使用openFileOutput方法開啟檔案以寫入資料時,需要指定開啟模式。預設為零,即MODE_PRIVATE。不同的模式對應的的含義如下:

常量 含義 
MODE_PRIVATE 預設模式,檔案只可以被呼叫該方法的應用程式訪問
MODE_APPEND 如果檔案已存在就向該檔案的末尾繼續寫入資料,而不是覆蓋原來的資料。
MODE_WORLD_READABLE 賦予所有的應用程式對該檔案讀的許可權。
MODE_WORLD_WRITEABLE 賦予所有的應用程式對該檔案寫的許可權。
但是Android 4.2開始,Android不推薦使用,MODE_WORLD_READABLE ,MODE_WORLD_WRITEABLE 這兩種模式。 

App在手機上儲存檔案或者快取資料時,應該遵守以下幾點:

  • 不要隨意佔用使用者的內建儲存。
  • 不要隨意在SD卡上新建目錄,應該放置自己應用包名對應的擴充套件儲存目錄下,解除安裝App時可以被自動清除。
  • 對佔用的磁碟空間有上限,並按照一定的策略進行清除。

 Android下有哪些檔案目錄

應用私有儲存(內建儲存)

        獲取方式:
               Context.getFileDir():獲取內建儲存下的檔案目錄,可以用來儲存不能公開給其他應用的一些敏感資料如使用者個人資訊
               Context.getCacheDir():獲取內建儲存下的快取目錄,可以用來儲存一些快取檔案如圖片,當內建儲存的空間不足時將系統自動被清除
        絕對路徑:
              Context.getFileDir():/data/data/應用包名/files/
              Context.getCacheDir():/data/data/應用包名/cache/
         寫許可權:不需要申請

這是手機的內建儲存,沒有root的過的手機是無法用檔案管理器之類的工具檢視的。而且這些資料也會隨著使用者解除安裝App而被一起刪除。這兩個目錄其實就對應著設定->應用->你的App->儲存空間下面的清除資料和清楚如下圖所示

 

應用擴充套件儲存(SD卡)

       獲取方式:
              Context.getExternalFilesDir():獲取SD卡上的檔案目錄
              Context.getExternalCacheDir():獲取SD卡上的快取目錄
       絕對路徑:
             Context.getExternalFilesDir():SDCard/Android/data/應用包名/files/
             Context.getExternalCacheDir():SDCard/Android/data/應用包名/cache/
       寫許可權:
           API < 19:需要申請
           API >= 19:不需要申請

既然是SD卡上的目錄,那麼是可以被其他的應用讀取到的,所以這個目錄下,不應該存放使用者的敏感資訊。同上面一樣的,這裡的檔案會隨著App解除安裝而被刪除,也可以由使用者手動在設定介面裡面清除。

 

公共儲存(SD卡)

     獲取方式:Environment.getExternalStorageDirectory()
     絕對路徑:SDCard/你設定的資料夾名字/
     寫許可權:需要申請

如果我們的App需要儲存一些公共的檔案,甚至希望下載下來的檔案即使在我們的App被刪除之後,還可以被其他App使用,那麼就可以使用這個目錄。這個目錄是始終需要申請SD寫入許可權的。
Android6.0下應該把檔案放到哪裡?

根據最開始提到的規則,其實如果僅僅是做了簡單的圖片快取工作,那麼我們應該把圖片快取放到/data/data/應用包名/cache/或者SDCard/Android/data/應用包名/cache/,因為在6.0系統(API23)時,不需要申請許可權就可以向這兩個目錄寫入檔案。而且/data/data/應用包名/cache/目錄,是內建儲存的應用私有快取目錄,在系統空間不夠時還會被自動清除,對於圖片快取來講也是一個不錯的管理策略,不過谷歌建議我們最好還是自己實現快取清除管理,例如用DiskLruCache。