在開發中一般會對手機的記憶體進行操作,比如在使用應用過程中產生的一些日誌、圖片等資訊,我們有時候要對其進行必要的操作,所以要對檔案這一塊要有一個基礎的理解。
概念
1、內部儲存:
首先說明一個概念,內部儲存不是記憶體,而是像磁碟一樣可以儲存資料的地方,他在手機內部,屬於手機自帶記憶體的一部分。
內部儲存私有目錄
裡面有一個 data/data 資料夾,下面存放是所有應用程式的包名資料夾,這部分的內容只有在手機 root 之後才能看得到,如果使用的是模擬器,可以在 Android Device Monitor
中看到。
比如一個應用的包名為 com.test.test
那麼這個應用只能訪問 /data/data/com.test.test
目錄下面的檔案,其他 data/data
目錄下面的檔案這個應用是訪問不到的
方法:
-
Environment.getDataDirectory();
獲取data根目錄 -
getFilesDir()
方法用於獲取/data/data/<application package>/files
目錄 -
getCacheDir()
方法用於獲取/data/data/<application package>/cache
目錄 -
deleteFile()
刪除檔案 -
fileList()
列出所有檔案
注意:當使用者解除安裝 App 時,系統自動刪除 data/data 目錄下對應包名的資料夾及其內容。
2、外部儲存
這裡不要被外部儲存幾個字所迷惑,這裡說的外部儲存其實不單單指的外接的記憶體卡, Android 手機在出廠的時候的記憶體,比如平常我們所說的 64G 、128G 記憶體,這個部分就是我們開發人員所說的外部儲存。
那我們往手機裡面插入的記憶體卡叫什麼呢? 對的,也是叫外部儲存。
在參考文章看到一句話:只要是能看得到,都是外部儲存。
外部儲存私有目錄
備註:一般裝置都有內建 SD 卡,同時也提供外部 SD 卡擴充,可能對應路徑的目錄名有所差異。
如果沒有插入記憶體卡的話,一般外部儲存的私有目錄就是:
/storage/emulated/0/Android/data/app package name
複製程式碼
方法:
Environment.getExternalStorageDirectory();
獲取 SD 卡根目錄getExternalFilesDir()
方法用於獲取/storage/emulated/0/Android/data/<application package>/files
目錄getExternalCacheDir()
方法用於獲取/storage/emulated/0/Android/data/<application package>/cache
目錄
除了上面的files目錄和cache目錄,我們可以根據自己的分類建立其他的目錄,便於我們更好的管理
3、內部儲存私有目錄 VS 外部儲存私有目錄
不同點
-
預設情況下,系統並不會自動建立外部儲存空間的應用私有目錄。只有在應用需要的時候,開發人員通過 SDK 提供的 API 建立該目錄資料夾和操作資料夾內容
-
自 Android 7.0 開始,系統對應用私有目錄的訪問許可權進一步限制。其他 App 無法通過 file:// 這種形式的 Uri 直接讀寫該目錄下的檔案內容,而是通過 FileProvider 訪問
-
宿主 App 可以直接讀寫內部儲存空間中的應用私有目錄;而在 4.4 版本開始,宿主 App 才可以直接讀寫外部儲存空間中的應用私有目錄,使開發人員無需在 Manifest 檔案中或者動態申請外部儲存空間的檔案讀寫許可權
相同點
- 同屬於應用私有目錄,當使用者解除安裝 App 時,系統也會自動刪除外部儲存空間下的對應 App 私有目錄資料夾及其內容。
4、最後
內部儲存私有目錄:
- SharedPreferences
- SQLiteDatabase
- App 中的 WebView 快取頁面資訊
不要往裡面存放太多的資料
外部儲存私有目錄:
- 應用自己使用的圖片等資料
- 快取資料
- 日誌資料
如果想被其他應用訪問到的資料,在 SD 卡的根目錄再新建一些資料夾,就不要寫在外部儲存私有目錄下面了。
暫時寫這麼多,以後開發過程中繼續填補。
參考文章:
- android中的檔案操作詳解以及內部儲存和外部儲存
- 瞭解 Android 應用的檔案儲存目錄,掌握持久化資料的正確姿勢
- [Android入門之檔案系統操作(二)檔案操作相關指令](http://blog.csdn.net/mrlixirong/article/details/6800585)
你可以通過以下方式關注我: