1. 程式人生 > >Android 資料夾簡單介紹

Android 資料夾簡單介紹

Android 資料夾簡單介紹

現在有很多的android開發人員對android檔案的使用還不規範,要麼把所有的東西都存在SD卡上,要不就把所有的東西都存在應用內部儲存裡.甚至有許多的開發人員連這麼目錄的含義是什麼都不瞭解.這裡就簡單介紹一下android的資料夾使用.也只是個人的一些理解,用做拋磚引玉.

android 資料夾的組成

android裡資料夾是分為三個種類的.

  • 應用內部儲存—–隨應用解除安裝刪除
  • 應用拓展儲存—–位於SD卡,隨應用解除安裝刪除
  • android sd卡—–用於儲存公有檔案,不隨應用解除安裝刪除

下面就來詳細介紹以下向個資料夾.

android 應用內部儲存

應用記憶體儲位於/data/data/package_name/資料夾下,如我應用的包名是 com.android.dir.demo,則此用的應用記憶體儲就位於/data/data/com.android.dir.demo/下.此資料夾除非root,否則只有自己可訪問.用於儲存一些私密的資訊.如使用者資訊等.會隨者應用解除安裝而刪除.

一般這裡面會包含有幾個檔案files ,lib,cache等,詳細介紹如下

路徑名 作用
lib 用由存放so動態庫
cache 用於存放快取資料
files 用於存放應用產生的檔案,如日誌等
shared_prefs 存放 SharedPreferences生成的檔案,注意:如模式設定錯誤,則可能被其它應用讀取
datbases 存放資料庫檔案,一系統自動建立

這裡一般我們會使用到的資料夾只有cache和files,其它都是用系統自動建立的,或取其對應的File物件方式為

//獲取到files的檔案物件
File filesDir = context.getFilesDir();
//獲取到cache的檔案物件
File cacheDir = context.getCacheDir();

android拓展儲存

目錄位於SdCard/Android/data/package_name/下,這個是google為會規範app對SD卡的使用推出的,以前在app如果需要在SD卡上存一個檔案,一般都會在SD卡的根目錄下建一個.package_name檔案隱藏檔案,但是這樣做的壞處就是如果應用被解除安裝,這裡的資料就會變成垃圾資料.但是如果應用把檔案放在拓展儲存下的話,就是隨著應用的解除安裝而被清理掉.不會形成垃圾資料.而且這樣做還有一個好處,那就是在SDK>=19時,是可以不用申請SD卡讀寫許可權的.

但是這裡也存在一個問題,那就是這裡的目錄是可以被任意應用訪問的,所以這裡適合一儲存一此不敏感的資料,比如圖片的快取,一些音視訊檔案等.

具體的呼叫方法如下

File file2 = context.getExternalFilesDir(null);
File cache = context.getExternalCacheDir();

呼叫以上方法,/Android/data/{package_name}/files/和/Android/data/{package_name}/cache/就會自動的被建立成功.

android sd卡

現在Google官方已以不建議應用直接在SD卡上建立檔案了,所以除非必要,還是要把檔案建立在這裡.除了可能會產生垃圾資料這一點之外,還有一個問題,就是往SD卡了寫檔案,是需要申請許可權的.如果使用者拒絕了,那app就不能在SD卡上寫檔案了,同時由於拓展儲存也是位於SD卡上,如果使用者關閉了SD的讀寫許可權,那就會造成拓展儲存也無法使用.

如果需要使用SD卡,則需要事先申請許可權

 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
 <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>  

使用是需要判斷是否擁有SD卡,

public File getSDPath(){ 
       File sdDir = null; 
       boolean sdCardExist = Environment.getExternalStorageState()   
       .equals(android.os.Environment.MEDIA_MOUNTED);//判斷sd卡是否存在
       if(sdCardExist)   
       {                               
         sdDir = Environment.getExternalStorageDirectory();//獲取跟目錄
      }   
       return sdDir; 
}