當前位置:首頁 » 存儲配置 » 安卓文件存儲數據特點

安卓文件存儲數據特點

發布時間: 2023-12-17 03:10:58

1. Android數據存儲方式有什麼不同

  1. SharedPreferences共享偏好
    只能存儲一些Key/Value類似的成對的基本數據類型,所以一般用來保存配置(Settings)信息。使用簡單方便;

  2. Internal Storage內部存儲空間

    即設備出產前設定的儲存空間,一般安裝應用就安裝在此。比較穩定,存儲方便,操作簡單,更加安全(因為可以控制訪問許可權)等優點。而它唯一的缺點就是它比較有限,比較可貴。

  3. External Storage外部存儲空間

    類似SD卡以及一些擴展存儲,方便用戶存放更多的數據,如音樂下載,視頻等。存儲在外部存儲卡上的數據是所有應用程序都可見,用戶也可見(使用FileManager)。外部存儲卡不是隨時想用就能夠用的,所以一定要記得在使用之前檢查它的可用性。

  4. SQLite Database資料庫

    是Android自帶的一個小型資料庫。效率出眾,這是無可否認的。十分適合存儲結構化數據。方便在不同的Activity,甚至不同的應用之間傳遞數據。由專門的ContentProvider來幫忙管理和維護資料庫

  5. Internet網路

    網路是比較不靠譜的一個,因為移動終端的網路穩定性,以及所產生的流量讓人傷不起,用戶更傷不起。但若是對於非常重要的實時數據,或是需要發送給遠端伺服器處理的,也可以考慮使用網路實時發送。

  6. 綜上,

    1. 簡單數據和配置信息,SharedPreference是首選;
    2. 如果SharedPreferences不夠用,那麼就創建一個資料庫
    3.
    結構化數據,一定要創建資料庫,雖然這稍顯煩鎖,但是好處無窮
    4.
    文件就是用來存儲文件(也即非配置信息或結構化數據),如文本文件,二進制文件,PC文件,多媒體文件,下載的文件等等。
    5. 盡量不要創建文件
    6.
    如果創建文件,如果是私密文件或是重要文件,就存儲在內部存儲,否則放到外部存儲
    7.
    不要收集用戶數據,更不要發到網路上,雖然你們也有很多無奈。用戶也無奈,也無辜,但更無助
    平台為開發者准備了這么多的方式固然是一件好事,但我們要認清每一種的優點和缺點,根據實際情況選擇最合適的。還有一個原則就是最簡單原則,也就是說能用簡單的方式處理,就不要用復雜的方式。比如存儲幾個數據或簡單對象,用SharedPreference也能做到,何必還去寫個ContentProvider呢?


  7. 參考自:http://www.jb51.net/article/37225.htm

2. 安卓內外部存儲完全解析 -- 別再弄混了

安卓開發離不開手機存儲,然而大部分人對於安卓開發中的存儲概念存在誤區,內部外部SD卡傻傻分不清?

以下引用來自對 官方文檔 的理解

呵呵呵,先別說話,然而重點來了(敲黑板),按照官方的說法,

內部存儲是指系統的存儲空間,沒有root是訪問不到的呦親,比如sharedPreferenced或者database都是保存在這裡面的。

外部存儲,又分為 2 部分:

然而現實中,常常有同事把手機那個32G,64G存儲叫做內部存儲= =,寶寶好累,人家明明是 ExternalStorage !!

希望本篇能讓大家對內外部存儲有一個正確鮮明的認識

getFilesDir()

路徑如下

文檔 雲:若想操作該路徑,你需要一個輸出流:

就像這樣:

注: this 是 context 對象

路徑下會看到新文件哦

如果你還想讀取的話, 文檔 雲:你需要一個輸入流:

Log如下

getCacheDir()

文檔 雲:

路徑如下:

特別的,還有getDir() :

getDir("- -!.txt", Context.MODE_PRIVATE).getAbsolutePath()

路徑如下:

app_是系統自己加上去的

內部存儲就是系統的存儲,沒有root你是看不到的,內部存儲最大特點就是可以用Context對象調用各個獲取路徑的方法。比如: context.fileList()
那就是

下的文件遍歷。

而 deleteFile("ABC") 就是

刪除下名為 ABC 的文件
</br></br></br>

操作外部存儲你首先需要以下許可權

當你申請了write許可權,那麼read許可權默認也就通過啦

再判斷狀態:

if (Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState))

Environment.getExternalStorageDirectory()

這個路徑根據手機廠家不同會有些許變化

直接傳入 Environment 中的常量獲取相應的路徑,如下:

Environment.(Environment.DIRECTORY_ALARMS));

或者

Environment.(Environment.DIRECTORY_PICTURES));

公有目錄下,系統會區分不同類別 (例如鈴聲在系統設置中顯示為鈴聲而不是音樂)

4.4以後訪問該目錄不再需要許可權了

getExternalFilesDir(String type)

eg.
getExternalFilesDir(Environment.DIRECTORY_MUSIC)

特別的:ContextCompat下的

ContextCompat.getExternalFilesDirs(context,type)

返回一個File[],在4.4以後第一條數據默認外部主存儲目錄,第二條數據就是sd卡路徑啦,但是注意4.4之前是沒有第二條數據的哦

該目錄下的特點是卸載程序後,該目錄和其下所有文件均會被刪除

getExternalCacheDir()

注意,使用該目錄注意管理空間,你不能等系統幫你清理,而是自己清理不再需要的緩存

特別的:ContextCompat下的

ContextCompat.getExternalCacheDirs()

道理同上

發現特點了嗎朋友,無論外部內部,只有路徑中有包名,那麼就是私有的,而且是隨著程序的卸載而被刪除的, 有包名的路徑均是Context中的方法,而公有的路徑均是Environment調用的

這個貨真真是要了老命,一般的方法根部不好使,結合網上有的方法加上公司項目中的方法,總結如下:

百分百好用的獲取SD卡路徑方法:

最後集合 path 中的值就是SD卡根目錄

雖然無視版本百分百好用,但是如果你的手機有SD卡槽卻沒插SD卡,該方法最後 path 返回的是 null ,也就是說該方法無法判斷到底是沒插SD卡還是根本不支持SD卡

其實還有一種方法

String path = System.getenv("SECONDARY_STORAGE");

該方法只要你手機支持SD卡,無論你插沒插SD卡,均會返回SD卡路徑,但是 6.0及以上該方法被移除

Environment中源碼其實就是根據這個方法獲取路徑的

安卓官方文檔大家一定要看,他就是我們開發者的權威呀,聖經呀!!

3. android提供的數據存儲方式有幾種

對於Android平台來講,它的存儲方式也不外乎這幾種,按方式總體來分,也是文件,資料庫和網路。但從開發者的角度來講它可以分為以下五種方式:

1.SharedPreferences共享偏好
2.Internal Storage內部存儲空間
3.External Storage外部存儲空間
4.SQLite Database資料庫
5.Internet網路
這幾種方式各自有各自的優點和缺點,要根據不同的實際情況來選擇,而無法給出統一的標准。
如果想要了解可以繼續追問,滿意請採納。

4. 安卓的存儲機制

安卓的文件存儲分為內部存儲和外部存儲,在安卓早期,手機內置存儲很小,都是用於應用的私有存儲空間,外部存儲就是sdcard。往後發展,手機的內置存儲越來越大,同時也出現了一些不支持sdcard的手機。如今安卓的外部存儲已經不限於sdcard了。

內部存儲

手機內部存儲除了放置應用的私有和系統空間以外都為外部存儲,內部存儲空間有限。對於設備中每一個安裝的 App,系統都會在內部存儲空間的 data/data 目錄下以應用包名為名字自動創建與之對應的文件夾。這個文件夾用於 App 中的 WebView 緩存頁面信息,SharedPreferences 和 SQLiteDatabase 持久化應用相關數據等。

內部存儲包含的文件

外部存儲

在安卓文件的外部存儲部分又分為了應用的私有目錄和共有目錄。

私有目錄

外部的存儲的私有目錄地址可以根據context的相應方法得到。

公共目錄

外部的存儲的公有目錄可以根據Environment的相應方法得到。

創建文件測試

通過file創建data文件

Test 1

Filefile = newFile("data");

try{

//新建文件

booleanbl=file.createNewFile();

//判斷文件創建是否成功

Log.d("myTag","onCreate:"+bl);

}catch(IOExceptione){

e.printStackTrace();

}

運行結果

文件創建失敗

同時文件夾中沒有出現該文件

猜測創建失敗問題來自文件地址的問題

Test 2

Filefile=null;

file=newFile(getCacheDir()+"data");

try{

//新建文件

booleanbl=file.createNewFile();

//判斷文件創建是否成功

Log.d("myTag","onCreate:"+bl);

}catch(IOExceptione){

e.printStackTrace();

}

運行結果

文件創建成功,同時在/data/data/com.example.myapplication的地址處生成了名為cachedata的文件

文件名與預期不同

Test 3

Filefile=null;

file=newFile(getFilesDir()+"data");

try{

//新建文件

booleanbl=file.createNewFile();

//判斷文件創建是否成功

Log.d("myTag","onCreate:"+bl);

}catch(IOExceptione){

e.printStackTrace();

}

運行結果

創建了一個files文件夾及一個filesdata文件

filesdata文件位置:/data/data/com.example.myapplication/filesdata

Test 4

Filefile=null;

file=newFile(getCodeCacheDir()+"data");

try{

//新建文件

booleanbl=file.createNewFile();

//判斷文件創建是否成功

Log.d("myTag","onCreate:"+bl);

}catch(IOExceptione){

e.printStackTrace();

}

運行結果

code_cachedata地址:/data/data/com.example.myapplication/code_cachedata

Test 5

Filefile=null;

file=newFile(getCacheDir().getPath(),"data");

try{

//新建文件

booleanbl=file.createNewFile();

//判斷文件創建是否成功

Log.d("myTag","onCreate:"+bl);

}catch(IOExceptione){

e.printStackTrace();

}

運行結果

成功在cache文件下創建data文件

總結使用file類創建文件時需要詳細的地址,這里的地址可以通過context的getcacheDir()等方法得到

使用openFileinputStream創建

FileInputStreaminputStream=null;

try{

inputStream=openFileInput("data");

}catch(FileNotFoundExceptione){

e.printStackTrace();

}finally{

try{

inputStream.close();

}catch(IOExceptione){

e.printStackTrace();

}

新建了一個文件夾而沒有新建文件

將輸入流改為輸出流後

FileOutputStreamoutputStream=null;

try{

outputStream=openFileOutput("data",MODE_PRIVATE);

}catch(FileNotFoundExceptione){

e.printStackTrace();

}finally{

try{

outputStream.close();

}catch(IOExceptione){

e.printStackTrace();

}

成功創建文件

使用openfilexxxxstream在只輸入文件名進行創建文件時會默認在data/data/包名/files處創建文件,若不存在files文件則會新建一個files文件

File file = new File();

方法會讀取該文件地址的文件,如果沒有也不會報錯。

file.createNewFile();

會向該地址創建一個文件,返回一個bool值以判斷是否創建成功

openFileInputstream/openFileOutputstream都只能操作data/data/包名 處的文件

Tast 6

Filefile;

file=newFile(getExternalCacheDir(),"data");

try{

booleanbl=file.createNewFile();

Log.d("myTag","onCreate:"+bl);

}catch(IOExceptione){

e.printStackTrace();

}

需要讀寫公共空間操作有所區別

Filefile;

file=Environment.(Environment.DIRECTORY_DOWNLOADS);

FilemFile;

mFile=newFile(file,"data");

try{

booleanbl=mFile.createNewFile();

Log.d("myTag","onCreate:"+bl);

}catch(IOExceptione){

e.printStackTrace();

}

需要申明讀寫許可權對於android6.0以上還需要動態申請許可權

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

<uses-permissionandroid:name="android.permission.READ_EXTERNAL_STORAGE"/>

最後附上安卓所有文件存儲的地址的獲取方法

熱點內容
編程主機電腦 發布:2024-11-29 00:43:51 瀏覽:983
oc訪問成員變數嗎 發布:2024-11-29 00:14:59 瀏覽:517
七牛雲伺服器生成縮略圖 發布:2024-11-29 00:12:36 瀏覽:272
如何重設華為賬號密碼 發布:2024-11-29 00:03:33 瀏覽:813
安卓聽小說下載到哪個文件夾 發布:2024-11-29 00:03:01 瀏覽:932
閑魚掛腳本 發布:2024-11-29 00:01:27 瀏覽:630
ae加快緩存 發布:2024-11-28 23:50:34 瀏覽:342
java的版本號 發布:2024-11-28 23:48:18 瀏覽:100
sql存儲過程區別 發布:2024-11-28 23:35:37 瀏覽:919
ms計算機需要什麼配置 發布:2024-11-28 23:34:21 瀏覽:975