本文將爲大家介紹Android中數據存儲的五種方式,數據存儲可是非常重要的知識哦。
一,文件存儲數據
①在ROM存儲數據
關於在ROM讀寫文件,可以使用java中IO流來讀寫,但是谷歌很人性化,直接給你封裝了一下,所以就有了Context提供的這兩個方法:FileInputStream openFileInput(String name);
FileOutputStream openFileOutput(String name, int mode)。
這兩個方法第一個參數是文件名,第二個參數指定打開文件的模式。具體有以下四種:
Context.MODEPRIVATE:爲默認操作模式,代表該文件是私有數據,只能被應用本身訪問,在該模式下,寫入的內容會覆蓋原文件的內容,如果想把新寫入的內容追加到原文件中。可以使用Context.MODEAPPEND Context.MODE_APPEND:模式會檢查文件是否存在,存在就往文件追加內容,否則就創建新文件。 MODEWORLDREADABLE:表示當前文件可以被其他應用讀取;
MODEWORLDWRITEABLE:表示當前文件可以被其他應用寫入。 如果希望文件被其他應用讀和寫,可以傳入: openFileOutput("demo.txt", Context.MODEWORLDREADABLE +Context.MODEWORLDWRITEABLE);
使用這兩個方法默認的存儲位置/data/data/包名/files/...
-------------------------------------------------------------------------
在這順便說一下,Linux文件的訪問權限:
示例:drwxrwxrwx
r:讀 w:寫 x:執行
第1位:d表示文件夾,-表示文件
第2-4位:rwx,表示這個文件的所有者用戶對該文件的權限
第5-7位:rwx,表示與文件所有者用戶同組的用戶對該文件的權限
第8-10位:rwx,表示其他用戶組的用戶對該文件的權限
-------------------------------------------------------------------------
此外,context還提供了其他幾個方法:
getFilesDir()得到的file對象的路徑是data/data/包名/files
存放在這個路徑下的文件,只要你不刪,它就一直在
getCacheDir()得到的file對象的路徑是data/data/包名/cache
存放在這個路徑下的文件,當內存不足時,有可能被刪除
系統管理應用界面的清除緩存,會清除cache文件夾下的東西,清除數據,會清除整個包名目錄下的東西
示例代碼如下:
1 public void read() { 2 try { 3 FileInputStream fis = openFileInput("demo.txt"); 4 byte[] buff = new byte[1024]; 5 int len = 0; 6 if ((len = fis.read(buff)) != -1) { 7 System.out.println(new String(buff, 0, len)); 8 } 9 fis.close(); 10 } catch (FileNotFoundException e) { 11 e.printStackTrace(); 12 } catch (IOException e) { 13 e.printStackTrace(); 14 } 15 } 16 17 public void write(){ 18 try { 19 FileOutputStream fos = openFileOutput("demo.txt", MODE_PRIVATE); 20 fos.write("你若是感覺你有實力和我玩,良辰不介意奉陪到底 ".getBytes()); 21 fos.close(); 22 } catch (FileNotFoundException e) { 23 e.printStackTrace(); 24 } catch (IOException e) { 25 e.printStackTrace(); 26 } 27 28 }
使用openfileoutput()方法保存文件,文件是存放在手機裏面的,存放一些小文件還行,但要是存放視頻大文件,就需要在SD卡中進行存儲了。
②在SD卡存儲文件
1.判斷SD卡是否準備就緒。
if(Environment.getExternalStorageState()//用於獲取SDCard的狀態 .equals(Environment.MEDIA_MOUNTED))
2.獲取SD卡真實路徑
Environment.getExternalStorageDirectory()//external 外部的 directory 目錄
3.使用IO流操作SD卡上的文件
注意:讀寫SD卡需要設置權限。
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
示例代碼:
1 public void write(){ 2 //判斷sd卡狀態 3 if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){ 4 //創建file對象 5 File file = new File(Environment.getExternalStorageDirectory(), "info.txt"); 6 try { 7 FileOutputStream fos = new FileOutputStream(file); 8 fos.write(("你若是感覺你有實力和我玩,良辰不介意奉陪到底").getBytes()); 9 fos.close(); 10 } catch (Exception e) { 11 e.printStackTrace(); 12 } 13 } 14 else{ 15 Toast.makeText(this, "你的SD卡不可用,良辰建議你檢查一下", 0).show(); 16 } 17 18 } 19 20 //讀取 21 public void read(){ 22 File file = new File(Environment.getExternalStorageDirectory(), "info.txt"); 23 if(file.exists()){ 24 try { 25 FileInputStream fis = new FileInputStream(file); 26 //把字節流轉換成字符流 27 BufferedReader br = new BufferedReader(new InputStreamReader(fis)); 28 String text = br.readLine(); 29 System.out.println(text); 30 } catch (Exception e) { 31 e.printStackTrace(); 32 } 33 } 34 }
平時在往SD卡或者ROM中存儲大文件的時候,常常需要判斷一下空間大小。接下來再爲大家介紹一下如何獲得存儲設備剩餘容量大小。
首先你得知道這兩個知識:
- 存儲設備會被分爲若干個區塊,每個區塊有固定的大小
- 區塊大小 * 區塊數量 等於 存儲設備的總大小
好了直接上代碼。
1 //獲得SD卡總大小 2 private String getSDTotalSize() { 3 File path = Environment.getExternalStorageDirectory(); 4 //statfs 說他頭髮少 StatFs 一個模擬linux的df命令的一個類,獲得SD卡和手機內存的使用情況 5 StatFs stat = new StatFs(path.getPath()); 6 long blockSize = stat.getBlockSize(); 7 long totalBlocks = stat.getBlockCount(); 8 //Formatter.formatFileSize()——一個區域化的文件大小格式化工具。 9 return Formatter.formatFileSize(MainActivity.this, blockSize * totalBlocks); 10 } 11 //獲得sd卡剩餘容量,即可用大小 12 private String getSDAvailableSize() { 13 File path = Environment.getExternalStorageDirectory(); 14 StatFs stat = new StatFs(path.getPath()); 15 long blockSize = stat.getBlockSize(); 16 long availableBlocks = stat.getAvailableBlocks(); 17 return Formatter.formatFileSize(MainActivity.this, blockSize * availableBlocks); 18 } 19 //底層就是statfs,和上面結果一樣 20 long easy = Environment.getExternalStorageDirectory().getFreeSpace(); 21 22 //獲得機身內存總大小 23 private String getRomTotalSize() { 24 File path = Environment.getDataDirectory(); 25 StatFs stat = new StatFs(path.getPath()); 26 long blockSize = stat.getBlockSize(); 27 long totalBlocks = stat.getBlockCount(); 28 return Formatter.formatFileSize(MainActivity.this, blockSize * totalBlocks); 29 } 30 //獲得機身可用內存 31 private String getRomAvailableSize() { 32 File path = Environment.getDataDirectory(); 33 StatFs stat = new StatFs(path.getPath()); 34 long blockSize = stat.getBlockSize(); 35 long availableBlocks = stat.getAvailableBlocks(); 36 return Formatter.formatFileSize(MainActivity.this, blockSize * availableBlocks); 37 }
好了,終於把第一種講完了,手爲什麼這麼酸。。。。。。
二,使用SharedPreferences存儲數據
首先介紹一下SharedPreferences,有一個姑娘,她有一些任性,還有一些囂張。(⊙o⊙)…走神了。。。。
SharedPreferences是Android平臺上一個輕量級的存儲類,主要保存一些常用的配置信息。它的本質是基於xml文件存儲Kay-value鍵值對數據。
SharedPreferences存儲步驟如下:
1.通過context獲取SharedPreferences對象。
2.利用SharedPreferences的edit方法獲取Editor對象。
3.通過Editor對象存儲key-value鍵值對數據
4.通過commit方法提交。
示例代碼:
1 //往SharedPreferences存儲數據 2 SharedPreferences sp = getSharedPreferences("config.txt", MODE_PRIVATE); 3 Editor edit = sp.edit(); 4 edit.putString("name", "葉良辰"); 5 edit.commit(); 6 7 //從SharedPreferences讀取數據 8 String name = sp.getString("name", ""); 9 Log.i("MainActivity", name);
使用SharedPreferences會把數據存儲在/data/data/<package name>/shared_prefs
溫馨提示:篇幅有點大,請移步。。。。。(還沒寫,寫完之後會貼出來)。