Android 資料儲存 外部儲存 SD卡

2021-07-04 21:40:51 字數 4010 閱讀 4429

使用外部儲存實現資料持久化,這裡的外部儲存一般就是指的是sdcard。使用sdcard儲存的資料,不限制只有本應用訪問,任何可以有訪問sdcard許可權的應用均可以訪問,而sdcard相對於裝置的內部儲存空間而言,會大很多,所以一般比較大的資料,均會存放在外部儲存中。

使用sdcard儲存資料的方式與內部儲存的方式基本一致,但是有三點需要注意的:

//如果手機已插入sd卡,且應用程式具有讀寫sd卡的能力,下面語句返回true。

environment.getexternalstoragestate().

equals(environment.media_mounted)

使用的environment.getexternalstoragestate()方法,返回的是乙個字串資料,environment封裝好了一些final物件進行匹配,除了environment.media_mounted外,其他均為有問題,所以只需要判斷是否是environment.media_mounted狀態即可。

//在sd卡中建立與刪除檔案許可權

android:name=

"android.permission.mount_unmount_filesystems"

>

>

//向sd卡中寫入資料許可權

android:name=

"android.permission.write_external_storage"

>

>

外部儲存中的檔案是可以被使用者或者其他應用程式修改的,有兩種型別的檔案(或者目錄):

1.私有檔案private files:

其實由於是外部儲存的原因即是是這種型別的檔案也能被其他程式訪問,只不過乙個應用私有的檔案對其他應用其實是沒有訪問價值的(惡意程式除外)。外部儲存上,應用私有檔案的價值在於解除安裝之後,這些檔案也會被刪除。類似於內部儲存。

所有應用程式的外部儲存的私有檔案都放在sd卡根目錄的android/data/下,目錄形式為:/mnt/sdcard/android/data/< package_name>/files,可以通過函式context.getexternalfilesdir()函式獲得該目錄.

往外部儲存內讀寫檔案和判斷檔案是否存在(寫入到

/mnt/sdcard/android/data/com.***.***/files目錄下)

//往外部儲存器寫檔案,將string s 寫入檔案extral.test中

private

void

write(string s)

catch (filenotfoundexception e) catch (ioexception e) }}

//從外部儲存器中的extral.test檔案中讀取內容。

private string read()

catch (filenotfoundexception e) catch (ioexception e)

return

null;

}

執行上面**會發現/mnt/sdcard/android/data/< package_name>/files/目錄下多了個extral.test檔案。

如果你的api 版本低於8,那麼不能使用getexternalfilesdir(),而是使用environment.getexternalstoragedirectory()獲得根路徑之後,自己再想辦法操作/android/data/< package_name>/files下的檔案。

也就是說api 8以下的版本在操作檔案的時候沒有專門為私有檔案和公共檔案的操作提供api支援。你只能先獲取根目錄,然後自行想辦法。

在外部儲存器上儲存快取檔案:

如果將應用程式的外部儲存的私有檔案作為快取檔案的話,可放在目錄/mnt/sdcard/android/data/< package_name>/cache下,可以通過函式:context.getexternalcachedir()

如果你的api 版本低於8,那麼不能使用getexternalcachedir(),而是使用environment.getexternalstoragedirectory()獲得根路徑之後,自己再想辦法操作/android/data/< package_name>/files下的檔案。

也就是說api 8以下的版本在操作檔案的時候沒有專門為私有檔案和公共檔案的操作提供api支援。你只能先獲取根目錄,然後自行想辦法,例如下面**,獲取外部儲存快取的目錄:

public static string getexternalcachedir(context context)  

else

return sb.tostring();

}

2.公共檔案public files:

檔案是可以被自由訪問,且檔案的資料對其他應用或者使用者來說都是由意義的,當應用被解除安裝之後,其解除安裝前建立的檔案仍然保留。比如camera應用,生成的**大家都能訪問,而且camera不在了,**仍然在。

如果儲存的檔案不是應用程式所專有的,並且在應用程式被解除安裝時,不刪除這些檔案,那麼就要把它們儲存到外部儲存器上的乙個公共的目錄上。這些目錄位於外部儲存器的根目錄下,如:

如果你想在外儲存上放公共檔案你可以使用

environment.getexternalstoragepublicdirectory(sting type)

例子的話只需要把上面例子中的getexternalfilesdir(null)替換為environment.getexternalstoragepublicdirectory(),此方法需要乙個引數來指定公共目錄型別(如environment.directory_music、environment.directory_pictures、environment.directory_ringtones或其他的型別。如果需要,這個方法會建立適當的目錄)

例如:

file file = new file(environment.getexternalstoragepublicdirectory(environment.directory_music),"extral.test")
在/mnt/sdcard/music/目錄下建立extral.test檔案。

補充:對於現在市面上很多android裝置,自帶了乙個大的儲存空間,一般是8gb或16gb,並且又支援了sdcard擴充套件,對於這樣的裝置,使用enviroment.

getexternalstoragedirectory()方法只能獲取到裝置自帶的儲存空間,對於另外擴充套件的sdcard而言,需要修改路徑。

注: 在沒有安裝sdcard的 華為榮耀6手機上(3ram,16grom):

通過以下函式獲得的路徑:

environment.getexternalstoragedirectory():

/storage/emulated/0

getexternalfilesdir(null):

/storage/emulated/0/android/data/com.example.filetest/files

getexternalcachedir():

/storage/emulated/0/android/data/com.example.filetest/cache

environment.getexternalstoragepublicdirectory(environment.directory_music):

/storage/emulated/0/music

但用以上函式儲存檔案時,獲得的根目錄為/storage/emulated/0,實際儲存在/mnt/shell/emulated/0/目錄下,

如:/mnt/shell/emulated/0//android/data/com.example.filetest/files

不知道怎麼回事?

參考:

Android外部儲存

外部儲存 public class externalstorgautils return bl 根據type型別判斷該file檔案是否存在 param type 檔案型別 return 是否存在 public static boolean ha ternalstoragetype string ty...

Android 內部儲存與外部儲存

android.permission.write external storage 注意 目前所有應用都可以讀取外部儲存,而無需特別的許可權。但這在將來版本中會進行更改。如果應用需要讀取外部儲存 但不向其寫入資訊 那麼您將需要宣告 read external storage許可權。android.p...

Android 外部儲存,內部儲存路徑

import android.content.context import android.os.environment import android.util.log public class directoryutils 獲取當前程式路徑 應用在記憶體上的目錄 data data com.exa...