Android中數據存儲(一)

國慶沒有給國家添堵,沒有勾搭妹子,乖乖的寫着自己的博客。。。。。

本文將爲大家介紹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

 

溫馨提示:篇幅有點大,請移步。。。。。(還沒寫,寫完之後會貼出來)。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章