tft每日頭條

 > 生活

 > android文件儲存路徑

android文件儲存路徑

生活 更新时间:2024-11-25 00:05:59

android文件儲存路徑(一篇文章搞懂android存儲目錄結構)1

前言

前兩天因為開發一個app更新的功能,我将從服務器下載的apk文件放在了内部存儲目錄(測試手機為小米,路徑為:data/user/0/packagename/files)下面,然後安裝的時候一直安裝不了,提示解析包出錯。後來查詢發現,安裝apk是調用了PackageInstaller,沒有相關權限,這個無法獲取内部路徑,所以會安裝不了。借機也複習了一遍Android下面存儲相關的知識點,總結一番。

存儲分類

android文件儲存路徑(一篇文章搞懂android存儲目錄結構)2

對于Android存儲目錄,我總結成一張思維導圖。上面這張圖很清楚的展示了Android存儲的目錄,接下來我們詳細分析每一個目錄。

  • 内部存儲

内部存儲位于系統中很特殊的一個位置,對于設備中每一個安裝的 App,系統都會在 data/data/packagename/xxx 自動創建與之對應的文件夾。如果你想将文件存儲于内部存儲中,那麼文件默認隻能被你的應用訪問到,且一個應用所創建的所有文件都在和應用包名相同的目錄下。也就是說應用創建于内部存儲的文件,與這個應用是關聯起來的。當一個應用卸載之後,内部存儲中的這些文件也被删除。對于這個内部目錄,用戶是無法訪問的,除非獲取root權限。

String fileDir = this.getFilesDir().getAbsolutePath();

String cacheDir = this.getcacheDir().getAbsolutePath();

一般情況下,我們獲取到的路徑為data/data/packagename/xxx,小米手機下面打印出來的結果如下:

android文件儲存路徑(一篇文章搞懂android存儲目錄結構)3

對于内部存儲路徑,我們一般通過以下兩種方式獲取,内部存儲空間的獲取都需要使用Context:

context.getFileDir()

對應内部存儲的路徑為: data/data/packagename/files,但是對于有的手機如:華為,小米等獲取到的路徑為:data/user/0/packagename/files

context.getCacheDir()

對應内部存儲的路徑為: data/data/packagename/cache,但是對于有的手機如:華為,小米等獲取到的路徑為:data/user/0/packagename/cache應用程序的緩存目錄,該目錄内的文件在設備内存不足時會優先被删除掉,所以存放在這裡的文件是沒有任何保障的,可能會随時丢掉。

  • 外部存儲

針對于外部存儲比較容易混淆,因為在Android4.4以前,手機機身存儲就叫内部存儲,插入的SD卡就是外部存儲,但是在Android4.4以後的話,就目前而言,現在的手機自帶的存儲就很大,現在Android10.0的話,有的手機能達到256G的存儲,針對于這種情況,手機機身自帶的存儲也是外部存儲,如果再插入SD卡的話也叫外部存儲,因此對于外部存儲分為兩部分:SD卡和擴展卡内存

我們通過一段代碼來獲取手機的外部存儲目錄,我們用的測試手機是三星G4,帶有插入SD卡的:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { File[] files = getExternalFilesDirs(Environment.MEDIA_MOUNTED); for (File file : files) { Log.e("file_dir", file.getAbsolutePath()); } }

對于以上代碼,打印的結果如下:

android文件儲存路徑(一篇文章搞懂android存儲目錄結構)4

打印出兩行目錄,第一行目錄是機身自帶的外部存儲目錄,目錄結構為:/storage/emulated/0/Android/data/packagename/files 第二行是存儲卡的目錄結構,路徑為:/storage/extSdCard/Android/data/packagename/files

擴展外部存儲

此目錄路徑需要通過context來獲取,同時在app卸載之後,這些文件也會被删除。類似于内部存儲。

getExternalCacheDir()

對應外部存儲路徑:/storage/emulated/0/Android/data/packagename/cache

getExternalFilesDir(String type)

對應外部存儲路徑:/storage/emulated/0/Android/data/packagename/files

SD卡存儲

SD卡裡面的文件是可以被自由訪問,即文件的數據對其他應用或者用戶來說都是可以訪問的,當應用被卸載之後,其卸載前創建的文件仍然保留。

對于SD卡上面的文件路徑需要通過Environment獲取,同時在獲取前需要判斷SD的狀态:

MEDIA_UNKNOWN SD卡未知

MEDIA_REMOVED SD卡移除

MEDIA_UNMOUNTED SD卡未安裝

MEDIA_CHECKING SD卡檢查中,剛裝上SD卡時

MEDIA_NOFS SD卡為空白或正在使用不受支持的文件系統

MEDIA_MOUNTED SD卡安裝

MEDIA_MOUNTED_READ_ONLY SD卡安裝但是隻讀

MEDIA_SHARED SD卡共享

MEDIA_BAD_REMOVAL SD卡移除錯誤

MEDIA_UNMOUNTABLE 存在SD卡但是不能挂載,例如發生在介質損壞

String externalStorageState = Environment.getExternalStorageState(); if (externalStorageState.equals(Environment.MEDIA_MOUNTED)){ //sd卡已經安裝,可以進行相關文件操作 }

getExternalStorageDirectory()

對應外部存儲路徑:/storage/emulated/0

getExternalStoragePublicDirectory(String type)

獲取外部存儲的共享文件夾路徑如:

DIRECTORY_MUSIC 音樂目錄

DIRECTORY_PICTURES 圖片目錄

DIRECTORY_MOVIES 電影目錄

DIRECTORY_DOWNLOADS 下載目錄

DIRECTORY_DCIM 相機拍照或錄像文件的存儲目錄

DIRECTORY_DOCUMENTS 文件文檔目錄

String externalStoragePublicDirectory = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM).getPath();

以上便是獲取相機DCIM目錄,對應獲取的路徑為:/storage/emulated/0/DCIM。

  • 系統存儲目錄

getRootDirectory()

對應獲取系統分區根路徑:/system

getDataDirectory()

對應獲取用戶數據目錄路徑:/data

getDownloadCacheDirectory()

對應獲取用戶緩存目錄路徑:/cache

相關概念區别
  • getFileDir()和getCacheDir()區别

這兩個都位于内部存儲目錄/data/data/packagename/下面,位于同一級别,前者是file目錄下面,後面是cache目錄下。

android文件儲存路徑(一篇文章搞懂android存儲目錄結構)5

  • getFileDir()和getExternalFilesDir(String type)區别

前者位于内部存儲目錄/data/data/packagename/file下面,後者位于外部存儲目錄/storage/emulated/0/Android/data/packagename/files下面,它們都存在于應用包名下面,也就是說屬于app應用的,所以當app卸載後,它們也會被删除的。

對于前面提到的app下載升級功能,我們從服務器端下載的app需要放到外部存儲目錄下面,而不是内部存儲目錄,因為内部存儲目錄的空間很小。另外我也做了相關測試,如果将apk放到内部存儲目錄file下面的話,安裝時會出現問題,提示解析包出錯。

  • 清除數據和清除緩存的區别

在app中有清除數據和清除緩存這兩個概念,那麼這兩者分别清除的是什麼目錄下面的數據呢?

清除數據

清除數據清除的是保存在app中所有數據,就是上面提到的位于packagename下面的所有文件,包含内部存儲(/data/data/packagename/)和外部存儲(/storage/emulated/0/Android/data/packagename/)。當然除了SD卡上面的數據,SD卡上面的數據當app卸載之後還會存在的。

清除緩存

緩存是程序運行時的臨時存儲空間,它可以存放從網絡下載的臨時圖片,從用戶的角度出發清除緩存對用戶并沒有太大的影響,但是清除緩存後用戶再次使用該APP時,由于本地緩存已經被清理,所有的數據需要重新從網絡上獲取。為了在清除緩存的時候能夠正常清除與應用相關的緩存,請将緩存文件存放在getCacheDir()或者 getExternalCacheDir()路徑下。

android文件儲存路徑(一篇文章搞懂android存儲目錄結構)6

以上便是Android系統中管存儲目錄的一些知識。

,

更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!

查看全部

相关生活资讯推荐

热门生活资讯推荐

网友关注

Copyright 2023-2024 - www.tftnews.com All Rights Reserved