在使用File存儲App數(shù)據(jù)時,我們需要了解Android系統(tǒng)的存儲系統(tǒng)。Android的存儲分為內(nèi)部存儲和外部存儲。
創(chuàng)新互聯(lián)堅持“要么做到,要么別承諾”的工作理念,服務(wù)領(lǐng)域包括:成都網(wǎng)站建設(shè)、成都網(wǎng)站制作、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣等服務(wù),滿足客戶于互聯(lián)網(wǎng)時代的麻栗坡網(wǎng)站設(shè)計、移動媒體設(shè)計的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡(luò)建設(shè)合作伙伴!
由于Android系統(tǒng)的廠商比較多,對于外部存儲目錄的定義有所不同,可能在根目錄下的mnt,sdcard和storage下。以storage為例,打開emulated/0目錄,外部存儲目錄就出現(xiàn)了。雖然可以通過多種路徑打開外部存儲文件,但是最終他們的路徑是相同的:
mnt:
storage:
sdcard:
外部存儲目錄下包含兩大類:公有目錄和私有目錄
私有目錄:
對比下來External有以下幾點優(yōu)點:
缺點:
內(nèi)部存儲與外部存儲權(quán)限申請對比如下:
首先我們要獲取外部存儲目標(biāo)文件的路徑:
然后確定自己需要創(chuàng)建的文件名,結(jié)合上面的到的路徑,創(chuàng)建一個File對象:
Android系統(tǒng)默認(rèn)數(shù)據(jù)清理的路徑是,內(nèi)部存儲目錄中相應(yīng)的cache文件夾中的文件和外部存儲中相應(yīng)的cache文件夾中的文件。
你的app的internal storage 目錄是以你的app的包名作為標(biāo)識存放在Android文件系統(tǒng)的特定目錄下[data/data/com.example.xx]。 從技術(shù)上講,如果你設(shè)置文件為可讀的,那么其他app就可以讀取你的internal文件。然而,其他app需要知道你的包名與文件名。若是你沒有設(shè)置為可讀或者可寫,其他app是沒有辦法讀寫的。因此只要你使用MODE_PRIVATE ,那么這些文件就不可能被其他app所訪問。
另外記住一點,內(nèi)部存儲在你的APP卸載的時候,會一塊被刪除,因此,我們可以在cache目錄里面放置我們的圖片緩存,而且cache與files的差別在于,如果手機(jī)的內(nèi)部存儲空間不夠了,會自行選擇cache目錄進(jìn)行刪除,因此,不要把重要的文件放在cache文件里面,可以放置在files里面,因為這個文件只有在APP被卸載的時候才會被刪除。還有要注意的一點是,如果應(yīng)用程序是更新操作,內(nèi)部存儲不會被刪除,區(qū)別于被用戶手動卸載。
不管你是使用 getExternalStoragePublicDirectory() 來存儲可以共享的文件,還是使用 getExternalFilesDir() 來儲存那些對于你的app來說是私有的文件,有一點很重要,那就是你要使用那些類似DIRECTORY_PICTURES 的API的常量。那些目錄類型參數(shù)可以確保那些文件被系統(tǒng)正確的對待。例如,那些以DIRECTORY_RINGTONES 類型保存的文件就會被系統(tǒng)的media scanner認(rèn)為是ringtone而不是音樂。
在開發(fā)中,不建議往內(nèi)部存儲中寫太多的數(shù)據(jù),畢竟空間有限。外部存儲在使用的時候最好能夠?qū)⑽募娣旁谒接心夸浵?,這樣有利于系統(tǒng)維護(hù),也避免用戶的反感。
徹底理解android中的內(nèi)部存儲與外部存儲
Android存儲挖坑記
緩存文件可以放在哪里?它們各自的特點是什么
??在平常使用Android手機(jī)的時候,我們都知道,幾乎每一個app都在/data/data/相應(yīng)的包名的文件夾下保存數(shù)據(jù)。那這些數(shù)據(jù)怎么進(jìn)行保存的呢?在這里,將簡單的介紹一下。
??Context類中有一個openFileOutPut方法,這個方法可以將我們的數(shù)據(jù)保存在data目錄下的文件里面。
??openFileOutput(String name, int mode)方法中帶兩個參數(shù),第一個參數(shù)是文件名,這里只能寫文件的名字,不能包含路徑,因為所有的數(shù)據(jù)都保存在/data/data/應(yīng)用包名/files/目錄下;第二個參數(shù)是文件的操作模式,有MDOE_PRIVATE,MODE_APPEND,MODE_WORLD_READABLE和MODE_WORLD_WRITEABLE。
??其中MODE_PRIVATE模式的是默認(rèn)的操作模式,每一次寫入的內(nèi)容時,都會覆蓋前面的內(nèi)容;MODE_APPEND模式表示的是每次寫入的內(nèi)容追加在前面的后面;MODE_WORLD_READABLE表示的是其他應(yīng)用程序可以對該文件進(jìn)行寫的操作;MODE_WORLD_WRITEABLE表示的是其他應(yīng)用程序可以對該文件進(jìn)行讀的操作。不過在后面的兩種模式過于危險,google已經(jīng)在Android 4.2中廢棄了。
??openFileOutput()方法返回的是一個FileOutPutStream的對象,得到了這個對象,就可以使用Java的IO流來對文件的使用了。
??點擊保存過后,就會把我們的數(shù)據(jù)保存在data目錄下。
??如果我們想要查看的話,就可以在Android studio(我是2.3.2的版本)中找到Tools-Android-Android Device Monitor
??再打開/data/data/應(yīng)用包名/files/,發(fā)現(xiàn)有一個文件,就是我們之前創(chuàng)建的一個文件。
??我們可以點擊右上角的圖標(biāo)進(jìn)行相應(yīng)的導(dǎo)出工作,對相應(yīng)的文件進(jìn)行導(dǎo)出操作。
??在Context類中,與openFileOutput方法對應(yīng)的是openFileInput方法,用戶從data目錄讀取相應(yīng)的數(shù)據(jù)。這個方法相較于openFileOutput方法簡單一些。
效果示意圖:
Android提供以下四種存儲方式:
1.SharePreference
2.SQLite
3.File
4.ContentProvider
SharedPreference:
SharedPreference是一種輕型的數(shù)據(jù)存儲方式,實際上是基于XML文件存儲的“key-value”鍵值對數(shù)據(jù)。通常用來存儲程序的一些配置信息。其存儲在“data/data/程序包名/shared_prefs目錄下。
SharedPreference本身只能獲取數(shù)據(jù),不支持存儲和修改。存儲和修改要通過Editor對象來實現(xiàn)。
SQLite:
SQLite是一個輕量級關(guān)系型數(shù)據(jù)庫,既然是關(guān)系型數(shù)據(jù)庫,那操作起來其實跟mysql、sql
server差不多的。
需要注意的一點是,SQLite只有NULL、INTEGER、REAL(浮點數(shù))、TEXT(字符串)和BLOB(大數(shù)據(jù))五種類型,不存在BOOLEAN和DATE類型。
File:
常說的文件(I/O)存儲方法,常用語存儲大數(shù)量的數(shù)據(jù),但是缺點是更新數(shù)據(jù)將是一件困難的事情。
ContentProvider:
ContentProvider相對于其它的方式比較復(fù)雜,當(dāng)然其功能相對于其它的方式也是革命性的改變。它能夠?qū)崿F(xiàn)跨應(yīng)用之間的數(shù)據(jù)操作。利用ContentResolver對象的delete、update、insert、query等方法去操ContentProvider的對象,讓ContentProvider對象的方法去對數(shù)據(jù)操作。